15. 三数之和

15. 三数之和


题目链接:15. 三数之和

代码如下:

//参考题解:https://leetcode.cn/problems/3sum/solutions/2434939/san-shu-zhi-he-shuang-zhi-zhen-c-jian-da-jldr
//双指针法
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;

        for(int i=0;i<nums.size()-2;i++)//固定第一个元素
        {
            if(i>0&&nums[i]==nums[i-1])
                continue;

            //以下两行是优化
            //元素依然有序,如果这三个都大于0,再往后比均大于0
            // if(nums[i]+nums[i+1]+nums[i+2]>0)
            //     break;

            int left=i+1,right=nums.size()-1;

            while(left<right)//对后两个元素用双指针法
            {
                int x=nums[i]+nums[left]+nums[right];

                if(x==0)
                {
                    res.push_back(vector<int>{nums[i],nums[left],nums[right]});
                    while(left<right&&nums[left]==nums[left+1])
                        left++;
                    while(left<right&&nums[right]==nums[right-1])
                        right--;

                    left++;
                    right--;
                }
                else if(x<0)
                    left++;
                else
                    right--;
            }
        }   

        return res;
    }
};

你可能感兴趣的:(leetcode,c++)