LeetCode 15 3Sum(数组,双指针)

题目链接https://leetcode.com/problems/3sum/description/

题意:给一个数组,找出数组中的三个元素组成三元组[a,b,c],使得a+b+c=0,三元组不得重复。

思路:首先将数组从小到大排序,之后先固定a,对a后的数组进行头尾双指针搜索,使得b和c相互靠近,根据a+b+c的大小判断每次移动b还是c,注意三元组不能重复,所以要跳过重复元素。

代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int> > res;
        sort(nums.begin(),nums.end());
        int i=0,j,k;
        int tail=nums.size()-1;
        while(i<=tail-2)
        {
            int a=nums[i];
            j=i+1;
            k=tail;
            while(j<k)
            {
                int b=nums[j];
                int c=nums[k];
                int sum=a+b+c;
                if(sum==0) res.push_back({a,b,c});
                if(sum<=0)
                    while(nums[j]==b&&j<k)
                        j++;
                if(sum>=0)
                    while(nums[k]==c&&j<k)
                        k--;
            }
            while (nums[i]==a&&i<=tail-2)
                i++;
        }
        return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值