题解 | #三数之和# 双指针 秒

三数之和

https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

class Solution {
public:
    // 官解 效率更高的 双指针法
    vector<vector<int> > threeSum(vector<int> &num) {

        int n = num.size();
        if(n<=2)
            return {};

        sort(num.begin(), num.end());
        vector<vector<int>> ans;
        // 最外层枚举a

        for(int i = 0; i<n-2; ++i)
        {
            // 注意去重
            if(i!=0 && num[i]==num[i-1])
                continue; // 否则之后两个数字的组合会重复
            int a=num[i];
            // 之后用双指针
            int left = i+1;
            int right = n-1;
            // b+c的值
            int t = -a;

            while(left<right)
            {
                if(num[left]+num[right] == t)
                {
                    ans.push_back({a, num[left], num[right]});
                    while(left+1<right && num[left]==num[left+1])
                        left++; // 跳过相连企鹅相等的
                    while(left<right-1 && num[right-1]==num[right])
                        right--;
                    
                    //用完一次后 收缩
                    left++;
                    right--;
                }
                else if(num[left] + num[right]>t)
                {
                    // 偏大 那就减小 r左移
                    right--;
                }
                else
                {
                    left++;
                }
            }
        }

        return ans;
        
    }
};

里面去重的思路 我得再试试

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务