18.四数之和 (Medium)*
题目描述*

标签*
双指针;
思路 & 代码*
前面有两数、三数、三数最接近,现在又来了个四数,没完没了了。。。
三数的时候是先排序然后在当前数右侧二分查找两个元素。感觉这个也就是在外面套个循环就行,时间复杂度 O(n^3)。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int len = nums.size();
vector<vector<int>> res;
if(len < 4) {
return res;
}
sort(nums.begin(), nums.end());
for(int i = 0; i < len; i++) {
if(nums[i] > target) {
return res;
}
if(i > 0 && nums[i] == nums[i - 1]) {
continue;
}
for(int j = i + 1; j < len - 2; j++) {
if(j > i + 1 && nums[j] == nums[j - 1]) {
continue;
}
int l = j + 1, r = len - 1;
int sum = target - nums[j] - nums[i];
while(l < r) {
int curSum = nums[l] + nums[r];
if(curSum == sum) {
res.push_back(vector<int>{nums[i], nums[j], nums[l], nums[r]});
while(l < r && nums[l] == nums[l + 1]) {
l++;
}
while(l < r && nums[r] == nums[r - 1]) {
r--;
}
l++;
r--;
}else if(curSum > sum) {
r--;
}else {
l++;
}
}
}
}
return res;
}
};
最后更新: July 23, 2022