LeetCode算法题——18. 4Sum

来源:互联网 发布:python 二叉树遍历 编辑:程序博客网 时间:2024/06/01 11:18
题目:
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]
]
算法思想:
与3Sum相似,只不过在3Sum基础上增加一层循环,可参考3Sum实现

C++代码实现:

#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution {public:    vector<vector<int> > fourSum(vector<int>& nums, int target) {    vector<vector<int> > result;    sort(nums.begin(),nums.end());    for(int m=0;m<nums.size();m++){    if(m>0&&nums[m]==nums[m-1])continue;            for(int i=m+1;i<nums.size();i++){if(i>m+1&&nums[i]==nums[i-1])continue; int twoSumTarget=target-nums[i]-nums[m];int j=i+1;int k=nums.size()-1;while(j<k){if(nums[j]+nums[k]==twoSumTarget){vector<int> temp;temp.push_back(nums[m]);        temp.push_back(nums[i]);        temp.push_back(nums[j]);        temp.push_back(nums[k]);                result.push_back(temp);        while (j < k && nums[j] == nums[j + 1]) ++j;//重复元素跳过                     while (i < k && nums[k] == nums[k - 1]) --k;        k--;        j++;}else if(nums[j]+nums[k]>twoSumTarget){//两数之和大于目标值,则尾指针向前移动 k--;}else{j++;}}             }        }        return result;    }};int main(){vector<vector<int> > result;int d[6]={1, 0, -1, 0, -2, 2};vector<int> data;for(int i=0;i<6;i++){data.push_back(d[i]);}Solution sol;result=sol.fourSum(data,0);for(int i=0;i<result.size();i++){for(int j=0;j<result[i].size();j++){cout<<result[i][j]<<" ";}cout<<endl;}}


0 0