左右指针也是属于双指针中的一种类型,我们可以使用左右指针来解决一些算法问题
一、分析
- 根据题目的叙述来看,给的是一个有序的数组(从小到大),按照常规思路,我们如果要找到符合题意的答案,需要对数组进行遍历,这样做的时间复杂度较大。这里我们可以使用左右指针来解决。
- 设置左指针left=0,右指针right=numbers.length-1
- 如果numbers[left]+numbers[right] > target,right–
- 如果numbers[left]+numbers[right] < target,left++
- 如果numbers[left]+numbers[right] = target,返回left+1和right+1
二、代码
int[] twoSum(int[] nums, int target) {
// ⼀左⼀右两个指针相向⽽⾏
int left = 0, right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) {
// 题⽬要求的索引是从 1 开始的
return new int[]{
left + 1, right + 1};
} else if (sum < target) {
left++; // 让 sum ⼤⼀点
} else if (sum > target) {
right--; // 让 sum ⼩⼀点
}
}
return new int[]{
-1, -1};
}
- JS版本