一.原题如下
二.解题思路
- 使用左右指针,左右指针相向而行(即左右向中心靠拢)
- 左指针的值相对较小,右指针的值相对较大
- 如果左右指针值相加大于目标值,则右指针走一步,即让值小一点;反之左指针走一步,让值大一点
- 因为下标是从1开始的,所有返回的索引数组,索引都需要+1
三.复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)
四.完整题解
具体步骤请查看每个关键步骤的代码注释
class Solution {
public int[] twoSum(int[] numbers, int target) {
// 定义左右指针
int left = 0, right = numbers.length - 1;
// 边界条件是:左指针必须小于右指针
while (left < right) {
int res = numbers[left] + numbers[right];
// 如果结果值和目标值相等,说明已经找到,结束循环即可
if (res == target) {
break;
}
// 如果结果值大于目标值,那么右指针往左走一步,说明值再取小一点
if (res > target) {
right--;
}
// 如果结果值小于目标值,那么左指针往右走一步,说明值再取大一点
else {
left++;
}
}
// 返回索引数组,索引额外+1
return new int[]{left + 1, right + 1};
}
}