提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
问题描述
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
重点剖析
该题若要暴力求解,其实思路很简单,采用循环遍历即可,但是这样时间复杂度太高,我们还是需要采用更高效的方法。本题的重点是考虑到数组是排序数组,也学习到了一种针对排序数组的方法,叫做双指针法。
思路分析
- 双指针的核心是一个指针开始在数组头部,另一个在尾部,此时计算两数之和,判断与目标值的大小关系;
- 若此时小于目标值,我们需要向右移动左边的指针,反之需要向左移动右边的指针,需要注意的是左边指针需要小于右边指针,这个也是可以作为我们循环的条件。
代码
class Solution {
public int[] twoSum(int[] numbers, int target) {
//思路:由于数组是排序的,所以可以采用双指针的方法
int i = 0;
int j = numbers.length - 1;
while (i < j && numbers[i] + numbers[j] != target) {
if (numbers[i] + numbers[j] < target) {
i++;
}else {
j--;
}
}
return new int[]{i,j};
}
}
总结
提示:重点记住这种针对排序数组的双指针方法。