思路:这次解法的时间复杂度是O(n^3),过程如下:
1、先对数组排序;
2、一次选出数组的两个元素;
3、再前面两个元素的后面分别标记两个前后索引,得到新的两个元素,与前面的两个元素相加,有3种情况考虑,1)如果和等于目标值,得到一个解,前索引后移,后索引前移去发掘新的解,2)如果和大于目标值,后索引前移以便减少和,3)和小于目标值,前索引后移增大和;
4、回到第2步,直到挑选完所有的数组元素。
注意:因为题目不能出现重复解,所以在记录解的数据结构中,最好采用set这一个值不会重复出现的结构,否则,需要在搜索过程中加以剔除重复元素。
code:
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int> > ret;
int len = num.size();
if(len <4)return ret;
sort(num.begin(),num.end());
vector<int> temp(4);
set<vector<int>> setRet;
for(int i=0;i <len-3;i++){
temp[0] = num[i];
for(int j=i+1;j<len - 2;j++){
temp[1] = num[j];
int tempTarget = target - temp[0] - temp[1];
int l = j+1, r = len-1;
while(l<r){
if(num[l] + num[r] == tempTarget){
temp[2] = num[l];
temp[3] = num[r];
setRet.insert(temp);
r--;
l++;
}
else if(num[l] + num[r] > tempTarget)
r--;
else
l++;
}
}
}
set<vector<int>>::iterator it = setRet.begin();
for(;it!=setRet.end();it++)
ret.push_back(*it);
return ret;
}
};
本文详细介绍了使用排序和双指针算法解决四数之和问题的思路与步骤,包括时间复杂度分析、核心逻辑实现及避免重复解的方法。通过实例演示了如何高效地找到所有满足条件的四元组。
3594

被折叠的 条评论
为什么被折叠?



