0018-四数之和

2019-01-20  本文已影响0人  liyoucheng2014

四数之和

方案一


基本类似0015-三数之和,需要手动进行去重复处理。主要可以进行的有三个地方,首先在两个for循环下可以各放一个,因为一旦当前的数字跟上面处理过的数字相同了,那么找下来肯定还是重复的。之后就是当sum等于target的时候了,我们在将四个数字加入结果res之后,left和right都需要去重复处理,分别像各自的方面遍历即可

C++-源代码


#include <iostream>
#include <queue>
#include <unordered_map>

using namespace std;

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

参考Grandyang

上一篇下一篇

猜你喜欢

热点阅读