4Sum

来源:互联网 发布:js object empty 编辑:程序博客网 时间:2024/05/18 01:30

一、问题描述

Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note: The solution set must not contain duplicate quadruplets.

For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.A solution set is:[  [-1,  0, 0, 1],  [-2, -1, 1, 2],  [-2,  0, 0, 2]]

二、思路

分别处理前两个数,解题思路类似3Num:3Num,我们先处理前两个数,在处理前两个数时,如果遇到和上一个数相同的数就跳过,还有由于是排过序的数组,所以如果当前的i所指向i 、 i + 1、i + 2、i + 3这四个数如果大于target,那么直接退出循环,如果i 和n -1、 n -2、 n -3这四个数之和小于target,则退出本次循环。第二个数的预处理和第一个数类似。接着处理第三第四个数,如果四个数的等于target,则直接存入数组,如果大于或者小于,就移动指针。

三、代码

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


0 0
原创粉丝点击