LeetCode_Day16

双指针

  • 双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多 个数组的多个指针。

  • 若两个指针指向同一数组,遍历方向相同且不会相交,则也称为 滑动窗口 (两个指针包围的 区域即为当前的窗口),经常用于区间搜索。

  • 若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是 排好序的。

[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)

关于双指针为什么不会漏掉答案的详细解释:

一张图告诉你 O(n) 的双指针解法的本质原理(C++/Java)


   转载规则


《LeetCode_Day16》 GeekOcean 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录