如何申请建设网站域名,重庆seo务,大气网站后台界面,163网站是jsp做的吗力扣题目链接:https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是#xff0c;数组中同一… 力扣题目链接:https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target请你在该数组中找出 和为目标值 target 的那 两个 整数并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1 输入 nums [2,7,11,15], target 9 输出 [0,1] 解释 因为 nums[0] nums[1] 9 返回 [0, 1] 。 示例 2 输入 nums [3,2,4], target 6 输出 [1,2] 示例 3 输入 nums [3,3], target 6 输出 [0,1] 提示 2 nums.length 104-109 nums[i] 109-109 target 109只会存在一个有效答案 进阶 你可以想出一个时间复杂度小于 O(n2) 的算法吗 方法一暴力枚举 最容易想到的方法是枚举数组中的每一个数 x寻找数组中是否存在 target - x。 当我们使用遍历整个数组的方式寻找 target - x 时需要注意到每一个位于 x 之前的元素都已经和 x 匹配过因此不需要再进行匹配。而每一个元素不能被使用两次所以我们只需要在 x 后面的元素中寻找 target - x。 代码 java class Solution { public int[] twoSum(int[] nums, int target) { int n nums.length; for (int i 0; i n; i) { for (int j i 1; j n; j) { if (nums[i] nums[j] target) { return new int[]{i, j}; } } } return new int[0]; } } 复杂度分析 时间复杂度O(N^2)其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。 空间复杂度O(1)。 方法二哈希表 注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此我们需要一种更优秀的方法能够快速寻找数组中是否存在目标元素。如果存在我们需要找出它的索引。 使用哈希表可以将寻找 target - x 的时间复杂度降低到从 O(N)O(N)O(N) 降低到 O(1)O(1)O(1)。 这样我们创建一个哈希表对于每一个 x我们首先查询哈希表中是否存在 target - x然后将 x 插入到哈希表中即可保证不会让 x 和自己匹配。 java class Solution { public int[] twoSum(int[] nums, int target) { MapInteger, Integer hashtable new HashMapInteger, Integer(); for (int i 0; i nums.length; i) { if (hashtable.containsKey(target - nums[i])) { return new int[]{hashtable.get(target - nums[i]), i}; } hashtable.put(nums[i], i); } return new int[0]; } } 复杂度分析 时间复杂度O(N)其中 N 是数组中的元素数量。对于每一个元素 x我们可以 O(1) 地寻找 target - x。 空间复杂度O(N)其中 N 是数组中的元素数量。主要为哈希表的开销。