18. 四数之和
- 题号:力扣18
- 知识点:双指针
- 目标完成度:63/150
- 总结
题干:
思路:
- 1.相似题目三数之和
- 2.最简单的想法就是四层循环,暴力解法,时间复杂度O( n 4 n^4 n4)
- 3.使用双指针将时间复杂度优化到O( n 3 n^3 n3)
- 4.两层循环来遍历得到
a
和b
,然后使用left
和right
来查找c
和d
。 - 5.其他思路与三数之和相似。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int>> ret;
if(nums.size()<4){
return ret;
}
for (int i = 0; i<nums.size(); i++){
// if(nums[i]>target){
// return ret;
// }
// 结果去重
if(i>0 && nums[i]==nums[i-1]){
continue;
}
for (int j = i+1; j<nums.size(); j++){
// if(nums[i]+nums[j]>target){
// return ret;
// }
// 结果去重
if(j>i+1 && nums[j]==nums[j-1]){
continue;
}
int left = j+1;
int right = nums.size()-1;
while(right>left){
// nums[i]+nums[j]+nums[left]+nums[right]会溢出
if(nums[i]+nums[j]>target-nums[left]-nums[right]){
right--;
while(right>left && nums[right]==nums[right+1]) right--;
}
else if(nums[i]+nums[j]<target-nums[left]-nums[right]){
left++;
while(right>left && nums[left]==nums[left-1]) left++;
}
else{
vector<int> a = {nums[i],nums[j],nums[left],nums[right]};
ret.push_back(a);
right--;
left++;
while(right>left && nums[right]==nums[right+1]) right--;
while(right>left && nums[left]==nums[left-1]) left++;
}
}
}
}
return ret;
}
};