双指针求数组中两数之和是否为目的值(力扣167两数之和II)

 题目分析:题目所给的数据为有序值,从小到大,所以尽可能的避免使用暴力来运算,两个for循环嵌套将达到O(n^2)的时间复杂度,想办法利用有序性,尽可能让一次判断可以达到一次循环的效果;

解题分析:对于所要求的target值,不妨在数组的两边加上相向指针,若头指针和尾指针之和大于target,则可以尝试让数值之和更小,既让尾指针向前移一位,因为不论是当前尾指针的值与任何数相加都一定会大于target(因为头指针是全数组最小的值),既可以永远排除掉当前的尾指针的值,再进行首位值想加,与target判断,若小了就将头指针向后移一位,重复上述过程,直到首尾之和等于target,然后返回头尾指针对应的id;

代码分析:

由于搞懂了逻辑会很简单所以我只强调需要注意的:

在此代码中关于输出的结果,因为题目默认数组的初始值从1id开始取,所以记得在结果处加一.

(代码取自b站up灵神,作者已在代码处标明,可自行搜索获得更完整的解题思路)

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        int left = 0, right = numbers.size() - 1;
        while (true) {
            int s = numbers[left] + numbers[right];
            if (s == target) return {left + 1, right + 1}; // 题目要求下标从 1 开始
            s > target ? --right : ++left;
        }
    }
};

作者:灵茶山艾府
链接:https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/solutions/1968341/san-shu-zhi-he-bu-hui-xie-xiang-xiang-sh-6wbq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值