算法笔记:双指针 - 三数之和

原题:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

基本思路:(其实是left、mid、right三指针)

        1. 排序

        2. 先固定left,使mid、right指针从两侧向中间移动

        3. 使mid、right所指值之和 等于 left所指值 的相反数

                若前者偏小:mid++

                若前者偏大:right--

        4. 最后再移动left,并重复上述步骤

易错点:由于答案中不可以包含重复的三元组,因此三个指针 均需添加跳过重复值的操作

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());    //排序
        vector<vector<int>> ans;
        int size = nums.size();
        for (int left=0; left<size-2; left++)    //左指针遍历范围
        {
            if (left > 0 && nums[left - 1] == nums[left]) continue;    //左指针去重
            int mid = left + 1, right = size - 1;
            while (mid < right)
            {
                if (nums[mid] + nums[right] == -nums[left])    //三指针之和为0时
                {
                    vector<int> temp = { nums[left],nums[mid++],nums[right--] };
                    ans.emplace_back(temp);
                    //中、右指针分别去重
                    while (mid<right && nums[right]==nums[right+1]) right--;
                    while (mid<right && nums[mid]==nums[mid-1]) mid++;
                }
                else if (nums[mid] + nums[right] > -nums[left])
                {
                    right--;    //中、右指针之和偏大,则左移right,使和减小
                }
                else 
                {
                    mid++;    //反之,右移mid,使和增大
                }
            }
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值