LeetCode18. 4Sum
2017-04-20 19:54
405 查看
Given an array S of n integers, are there elements a, b, c, 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]
]
思路,定义4个指针,p1,p2,p3,p4.顺序遍历p1,p2=p1+1开始遍历,然后p3=p2+1,p4=n-1,sum4 =nums[p1]+nums[p2]+nums[p3]+nums[p4],当 sum4小于target时,p3右移,sum4大于target时,p4左移,sum4等于target时,加入vector,直到p3>=p4
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]
]
思路,定义4个指针,p1,p2,p3,p4.顺序遍历p1,p2=p1+1开始遍历,然后p3=p2+1,p4=n-1,sum4 =nums[p1]+nums[p2]+nums[p3]+nums[p4],当 sum4小于target时,p3右移,sum4大于target时,p4左移,sum4等于target时,加入vector,直到p3>=p4
#include<vector> #include<algorithm> #include<iostream> using namespace std; class Solution { public: vector<vector<int>> fourSum(vector<int>& nums, int target) { int n=nums.size(); vector<vector<int>> res; if(n<4) return res; vector<int> resb; sort(nums.begin(),nums.end()); int e1=n-3,e2=n-2,p1=0,p2=1,p3=1,p4=n-1,sum4=0; while(p1<e1){ p2 = p1+1; while(p2<e2){ p3 = p2+1; p4 = n-1; while(p3<p4){ sum4 =nums[p1]+nums[p2]+nums[p3]+nums[p4]; if(sum4<target){ ++p3; } else if(sum4>target){ --p4; } else{ resb.push_back(nums[p1]); resb.push_back(nums[p2]); resb.push_back(nums[p3]); resb.push_back(nums[p4]); res.push_back(resb); resb.clear(); if(nums[p3]==nums[p3+1]){ while(nums[p3]==nums[p3+1]){ ++p3; } ++p3; } else{ ++p3; } --p4; } } if(nums[p2]==nums[p2+1]){ while(nums[p2]==nums[p2+1]){ ++p2; } ++p2; } else{ ++p2; } } if(nums[p1]==nums[p1+1]){ while(nums[p1]==nums[p1+1]){ ++p1; } } ++p1; } return res; } }; void main(){ int a[8]={-3,-2,-1,0,0,1,2,3}; vector<int> nums; //nums.reserve(8); //nums.assign(&a[0],&a[8]); nums.push_back(-3); nums.push_back(-2); nums.push_back(-1); nums.push_back(0); nums.push_back(0); nums.push_back(1); nums.push_back(2); nums.push_back(3); vector<int>::iterator it3=nums.begin(); for(it3=nums.begin();it3!=nums.end();++it3){ cout<<(*it3)<<" "; } cout<<endl; Solution So; vector<vector<int>> res=So.fourSum(nums,0); vector<vector<int>>::iterator it1=res.begin(); vector<int>::iterator it2=(*it1).begin(); for(it1=res.begin();it1!=res.end();++it1){ for(it2=(*it1).begin();it2!=(*it1).end();++it2){ cout<<(*it2)<<" "; } cout<<endl; } }
相关文章推荐
- leetcode18. 4Sum
- LeetCode18. 4Sum
- LeetCode18. 4Sum
- leetcode18. 4Sum
- LeetCode (18)4Sum
- LeetCode--4Sum
- LeetCode 4Sum
- 18. 4Sum
- leetcode--sum集合:2sum,3sum,4sum
- [Leetcode][求和问题2Sum/3Sum/4Sum/KSum]相关题目汇总/分析/总结
- [leetcode] 18. 4Sum
- LeetCode *** 18. 4Sum (Two Pointers)
- leetcode-18-4sum
- Leetcode 4Sum
- [Leetcode]4Sum
- leetcode 18 4Sum
- 【Leetcode】4Sum
- Leetcode 4Sum
- LeetCode – 4Sum (Java)
- LeetCode 18. 4Sum