来源Leetcode第167题两数之和 II - 输入有序数组
给定一个已按照升序排列\ 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
- 返回的下标值(index1 和 index2)不是从零开始的。
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
1 2 3
| 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
|
双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public int[] twoSum(int[] numbers, int target) { int [] ans = new int[2]; if(numbers.length == 0 || numbers.length == 1) return ans; HashMap<Integer,Integer> map = new HashMap<>(); int i = 0, j = numbers.length - 1; int sum = 0; while (i < j){ sum = numbers[i] + numbers[j]; if(sum == target) { ans[0] = i + 1; ans[1] = j + 1; break; }else if(sum > target) j--; else i++; } return ans; }
|
HashMap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public int[] twoSum(int[] numbers, int target) { int [] ans = new int[2]; if(numbers.length == 0 || numbers.length == 1) return ans; HashMap<Integer,Integer> map = new HashMap<>(); for(int i = 0 ; i < numbers.length ; i++){ if(map.containsKey(target - numbers[i])){ ans[0] = map.get(target - numbers[i]); ans[1] = i + 1; return ans; } else map.put(numbers[i], i+1); } return ans; }
|
二分查找
固定一个数,用二分查找搜索target-nums[I],时间复杂度O(nlgn),不如双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public int[] twoSum(int[] numbers, int target) { int [] ans = new int[2]; if(numbers.length == 0 || numbers.length == 1) return ans; int left = 0,right = numbers.length - 1,mid; for(int i = 0 ; i < numbers.length - 1; i++){ left = i + 1; while (left <= right){ mid = left + (right - left) / 2; if(numbers[mid] > target - numbers[i]) right = mid - 1; else if(numbers[mid] < target - numbers[i]) left = mid + 1; else{ ans[0] = i + 1; ans[1] = mid + 1; return ans; } } } return ans; }
|