leetcode - 15. 3Sum

双指针问题
在这里插入图片描述

#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
	static bool cmp(int a, int b)
	{
		return a<b;
	}
	vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> vv;
        if(nums.size()<3) return vv;
		sort(nums.begin(), nums.end(), cmp);
		vector<int> l;
        int i(0),j,k,prei=INT_MAX,prej=INT_MAX,n=nums.size(),sum;
        pair<int,int>pre=make_pair(INT_MAX,INT_MAX);
		
        while(i<n&&nums[i]<=0)
        {
            while(i<n&&nums[i]==prei)
            {
                ++i;
            }
            if(i==n)
            {
                break;
            }
            j=i+1;
            k=n-1;
			prej = INT_MAX;
            while(j<k)
            {
                sum=nums[j]+nums[k];
                if(nums[i]==-sum)
                {
                    if(prej!=nums[j])
                    {
                        l.clear();
                        l.push_back(nums[i]);
                        l.push_back(nums[j]);
                        l.push_back(nums[k]);
                        vv.push_back(l);
                        prej=nums[j];
                    }
                    ++j;
                }else if(sum>-nums[i])
                {
                    --k;
                }else{
                    ++j;
                }
            }
            prei=nums[i++];
        }
		return vv;
	}
};

猜你喜欢

转载自blog.csdn.net/weixin_41938758/article/details/88818038