题目链接
题目分析
非常简单的一个题目,因为给定的是一个有序数组,我们可以直接使用双指针思想去寻找两个目标元素。如果num[left] + num[right]==target 就保存循环结果然后退出循环,否则就看大小移动left或者right指针。
其实这个题还可以做二分查找 ,我们外层循环使用一个i去遍历0num.length-2这么多的元素,然后我们在内层使用二分查找,查找target-num[i]是否在数组inum.length-1中,存在的话就保存结果然后退出循环。
这个题其实是1. 两数之和的变种,第一题的输入数据是无序的,但是如果我们预处理输入数组后,也会变成这题的做法。对于第一题,我们最好的方法就是使用一个hashmap作为缓存,只需要一个O(n)的时间复杂度就可以完成解题。
代码实现
class Solution {
public int[] twoSum(int[] numbers, int target) {
int[] res = new int[2];
int left = 0;
int right = numbers.length - 1;
while(left < right){
if(numbers[left] + numbers[right] == target){
res[0] = left+1;
res[1] = right+1;
break;
}else if(numbers[left] + numbers[right] > target){
right--;
}else if(numbers[left] + numbers[right] < target){
left++;
}
}
return res;
}
}