给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
解题方法
暴力法
遍历数组,依次判断 arr[0]+arr[1]、arr[0]+arr[2] ...、arr[1]+arr[2]、arr[1]+arr[3] ...、arr[2]+arr[3]、arr[2]+arr[4] ...
因为需要遍历 N×(N-1)/2 次循环,所以时间复杂度为 O(N²)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public int[] twoSum(int[] nums, int target) { int[] result = new int[2]; for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { int sum = nums[i] + nums[j]; if (sum == target) { result[0] = i; result[1] = j; return result; } } } return result; } }
|
哈希表
- 赋值
map,以 nums 数组的值为 key,其索引为 value - 遍历数组,判断 map 是否包含
target - arr[索引] 的 key。因为数组中同一个元素在答案里不能重复出现,所以还需要保证 map.get(target - arr[索引]) != 当前索引值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public int[] twoSum(int[] nums, int target) { int[] result = new int[2]; HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { map.put(nums[i], i); } for (int j = 0; j < nums.length; j++) { int diff = target - nums[j]; if (map.containsKey(diff) && map.get(diff) != j) { result[0] = j; result[1] = map.get(diff); return result; } } return result; } }
|