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

三数之和

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

「不重复」的本质是什么?我们保持三重循环的大框架不变,只需要保证:

  • 第二重循环枚举到的元素不小于当前第一重循环枚举到的元素;
  • 第三重循环枚举到的元素不小于当前第二重循环枚举到的元素。
  • 同时,对于每一重循环而言,相邻两次枚举的元素不能相同
class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        sort(num.begin(), num.end());
        int n=num.size();
        if(n<3)
            return {};
        vector<vector<int>> ans;
//         unordered_map<pair<int, pair<int ,int>>, bool> hash;
        // b不等于a
        // c不等于b
        // 同一层循环的不能相等
        for(int i=0; i<n-1; i++)
        {
            if(i>0 && num[i]==num[i-1])
                continue; //去重
            int target=-num[i]; //a+b+c=0 == a+b=-c
            int left=i+1;
            int right=n-1;
            for(left; left<n-1; left++)
            {
                if(left>i+1 && num[left]==num[left-1])
                    continue; //去重
                while(left<right && num[left]+num[right]>target)
                    right--;
                if(left==right) 
                    break;
                if(num[left]+num[right]==target)
                    ans.push_back({num[i], num[left], num[right]});
            }
        }
        return ans;
    }
};
全部评论

相关推荐

高斯林的信徒:问你有没有保底,好人啊,就差把这是kpi面告诉你了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务