题目描述
给定一个已经按升序排列的数组,找到两个数使他们加起来的和等于特定数。
函数应该返回这两个数的下标,index1必须小于index2。注意返回的值不是 0-based。
样例
给定数组为 [2,7,11,15] ,target = 9
返回 [1,2]
首先想到的是通过双重循环遍历数组中所有的数据对找出和为target的两个数,但是这样做的时间复杂度为O(n²)。
解题思路
因为数组是已排序的,设两个指针l和r,l指向索引为0处,r指向索引为length-1处。若nums[l]+nums[r]大于target,则r-1使两数和变小,反之则使l+1使两数和变大从而不断接近target直至相等。此时时间复杂度为O(n)
代码:
public class Main {
/*
* @param nums: an array of Integer
* @param target: target = nums[index1] + nums[index2]
* @return: [index1 + 1, index2 + 1] (index1 < index2)
*/
public static int[] twoSum(int[] nums, int target) {
// write your code here
int l = 0;
int r = nums.length-1;
while ((nums[l]+nums[r])!=target){
if ((nums[l]+nums[r])<target){
l++;
}
if((nums[l]+nums[r])>target){
r--;
}
}
int[] res = {l+1,r+1};
return res;
}
}