Leetcode 15 3Sum

这道题又是对撞指针的妙用,使用对撞指针的几个注意点:

1.数组必须是排好序的。

2.对于各种相等的处理。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> ret;
        sort(nums.begin(), nums.end());
        
        for (int i=0; i<n-2; ++i) {
            int l = i + 1;
            int r = n - 1;
            
            while (l < r) {
                if (nums[l] + nums[r] == -nums[i]) {
                    ret.push_back({nums[i], nums[l++], nums[r--]});
                    
                    while (l < r && nums[l] == nums[l - 1]) {
                        ++l;
                    }
                    
                    while (l < r && nums[r] == nums[r + 1]) {
                        --r;
                    }
                }
                
                else if (nums[l] + nums[r] > -nums[i]) {
                    --r;
                }
                
                else {
                    ++l;
                }
            }
            
            while (i < n-2 && nums[i] == nums[i+1]) {
                ++i;
            }
        }
        
        return ret;
    }
};

 

posted @ 2018-08-29 21:07  ly-bnu  阅读(77)  评论(0)    收藏  举报