167. Two Sum II - Input array is sorted
一、题目
1、审题
2、分析
给出一个升序的整形数组,当两个元素之和为 target ,输出这两个元素的下标。(只有一组符合的数)
二、解答
1、思路:
方法一、
采用两个指针,start 从前向后移动,end 从后向前移动;当 num[start] + num[end] = target 时,输出。
public int[] twoSum2(int[] numbers, int target) { for (int i = 0, j = numbers.length - 1; i < j; ) { if(numbers[i] + numbers[j] == target) return new int[]{1+i, 1+j}; else if(numbers[i] + numbers[j] > target) j--; else i++; } return null; }
方法二、
遍历数组,以当前遍历的元素 num1 为假设的第一个符合的数,则 num2 = target - num1,采用二分查找在数组后续部分进行查找。
public int[] twoSum3(int[] numbers, int target) { for (int i = 0; i < numbers.length; i++) { int start = i + 1; int end = numbers.length - 1; int tmp = target - numbers[i]; while(start <= end) { int mid = start + ((end - start) >> 1); if(numbers[mid] == tmp) return new int[]{i + 1, mid + 1}; else if(numbers[mid] < tmp) start = mid + 1; else end = mid - 1; } } return null; }