lintcode 58. 四数之和

给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。

样例
例1:

输入:[2,7,11,15],3
输出:[]

例2:

输入:[1,0,-1,0,-2,2],0
输出:
[[-1, 0, 0, 1]
,[-2, -1, 1, 2]
,[-2, 0, 0, 2]]
注意事项
四元组(a, b, c, d)中,需要满足a <= b <= c <= d

答案中不可以包含重复的四元组。
class Solution {
public:
    /**
     * @param numbers: Give an array
     * @param target: An integer
     * @return: Find all unique quadruplets in the array which gives the sum of zero
     */
    vector<vector<int>> fourSum(vector<int> &numbers, int target) {
        // write your code here
        vector<vector<int>> result;
        set<vector<int>> judge;
        sort(numbers.begin(),numbers.end());
        int len=numbers.size();
        if(len<4) return result;
        for (int i = 0; i < len-3; i++) {
            /* code */
            if(i!=0&&numbers[i]==numbers[i-1]) continue;
            for(int j=i+1; j < len-2; j++)
            {
                if(j!=i+1&&numbers[j]==numbers[j-1]) continue;
                int left=j+1;
                int right=len-1;
                while(left<right)
                {
                    int sum=numbers[i]+numbers[j]+numbers[left]+numbers[right];
                    vector<int> tmp={numbers[i],numbers[j],numbers[left],numbers[right]};
                    if(sum==target&&!judge.count(tmp)) 
                    {
                        left++;
                        right--;
                        result.push_back(tmp);
                        judge.insert(tmp);
                    }
                    else if(sum<target) left++;
                    else right--;
                }
            }
        }
        return result;
    }
};
发布了369 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43981315/article/details/103970895