双指针
双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多 个数组的多个指针。
若两个指针指向同一数组,遍历方向相同且不会相交,则也称为 滑动窗口 (两个指针包围的 区域即为当前的窗口),经常用于区间搜索。
若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是 排好序的。
[167] 两数之和 II - 输入有序数组
https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/description/
- algorithms
- Easy (57.40%)
- Likes: 490
- Dislikes: -
- Total Accepted: 201.7K
- Total Submissions: 349.6K
- Testcase Example: ‘[2,7,11,15]\n9’
- Source Code: 167.two-sum-ii-input-array-is-sorted.cpp
给定一个已按照 升序排列 的整数数组 numbers
,请你从数组中找出两个数满足相加之和等于目标数 target
。
函数应该以长度为 2
的整数数组的形式返回这两个数的下标值。numbers
的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length
。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例 1:
输入:numbers = [2,7,11,15], target = 9 输出:[1,2] 解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
示例 2:
输入:numbers = [2,3,4], target = 6 输出:[1,3]
示例 3:
输入:numbers = [-1,0], target = -1 输出:[1,2]
提示:
2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers
按 递增顺序 排列-1000 <= target <= 1000
- 仅存在一个有效答案
方法1: 双指针
这是一个简单的双指针应用, 通过在数组首尾设置左右指针, 将其和与 target
进行对比, 若 sum > target
,则将右指针左移, 若 sum < target
, 则将左指针右移
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0, right = numbers.size() - 1, sum;
while(left < right){
sum = numbers[left] + numbers[right];
if(target == sum) break;
if(target > sum) left++;
else right--;
}
return vector<int>{left+1, right+1};
}
};
复杂度分析:
- 时间复杂度:
O(n)
, 双指针移动总数最多为 n - 空间复杂度:
O(1)
关于双指针为什么不会漏掉答案的详细解释: