一、题目描述
二、解题思路
三数之和会了,这道题就会了。
还是先排序,做去重复的初步准备
其实也就是三数之和外层再套一个遍历而已
但是不能直接就在
n
u
m
s
[
i
]
>
t
a
r
g
e
t
nums[i]>target
nums[i]>target
就返回,因为这个
t
a
r
g
e
t
target
target是人家任意指定的,有可能比数组里最小的还小,三数之和里人家指定了就是
0
0
0,这块有点不同,否则会被卡用例:
三、解题代码
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> ret;
sort(nums.begin(), nums.end());
ssize_t len = nums.size();
for(ssize_t i = 0; i < len - 3; i++){
//if(nums[i] > target) return ret;
if(i > 0 && nums[i] == nums[i - 1]) continue;
for(ssize_t j = i + 1; j < len - 2; j++){
if(j > i + 1 && nums[j] == nums[j - 1]) continue;
int left = j + 1, right = len - 1;
while(left < right){
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if(sum == target){
ret.push_back({nums[i], nums[j], nums[left], nums[right]});
while(left < right && nums[left] == nums[++left]);
while(left < right && nums[right] == nums[--right]);
}
else if(sum < target) while(left < right && nums[left] == nums[++left]);
else while(left < right && nums[right] == nums[--right]);
}
}
}
return ret;
}
};
四、复杂度分析
空间复杂度:快排递归栈,
S
(
n
)
S(n)
S(n)
时间复杂度,两层遍历+双指针,
O
(
n
3
)
O(n^3)
O(n3)