Leetcode 18 4Sum

这道题也是对撞指针的题目。很像3Sum,就多了一层循环,时间复杂度也就从O(n^2)增长到了O(n^3)。

 

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

 

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