题目描述:
给出一个有n个元素的数组S,S中是否有元素a,b,c和d满足a+b+c+d=目标值?找出数组S中所有满足条件的四元组。
注意:
四元组(a、b、c、d)中的元素必须按非降序排列。(即a≤b≤c≤d)
解集中不能包含重复的四元组。
例如:给出的数组 S = {1 0 -1 0 -2 2}, 目标值 = 0.↵↵ 给出的解集应该是:↵ (-1, 0, 0, 1)↵ (-2, -1, 1, 2)↵ (-2, 0, 0, 2)
解题思路:
这一道题相比于前两道又升级了,要求输出符合要求的四元组,首先也要将数组按从小到大的顺序排序,这次代码没有采用常规的遍历,而是先固定两个数,另外两个数用双指针的方法去寻找,两个指针分别从左和右出发,若和小于目标,则左指针+1,若和大于目标,则右指针-1.
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
sort(num.begin(),num.end());
vector<vector<int>>ans;
if(num.size()<=3)return ans;
int len=num.size();
for(int i=0;i<len-3;i++){
for(int j=i+1;j<len;j++){
int sum=target-num[i]-num[j];
int l=j+1;
int r=len-1;
while(l<r){
if(num[l]+num[r]>sum){
r--;
continue;
}
if(num[l]+num[r]<sum){
l++;
continue;
}
if(num[l]+num[r]==sum){
vector<int>tmp;
tmp.push_back(num[i]);
tmp.push_back(num[j]);
tmp.push_back(num[l]);
tmp.push_back(num[r]);
if(find(ans.begin(),ans.end(),tmp)==ans.end()){
ans.push_back(tmp);
}
r--;
l++;
}
}
}
}
return ans;
}
};