- 三数之和
排序+双指针
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size(); i++){
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
int left = i + 1;
int right = nums.size() - 1;
while(left < right){
if(nums[i] + nums[left] + nums[right] > 0){
right--;
}
else if(nums[i] + nums[left] + nums[right] < 0){
left++;
}
else{
res.push_back(vector<int> {nums[i], nums[left], nums[right]});
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
// 找到答案时,双指针同时收缩
right--;
left++;
}
}
}
return res;
}
};
时间复杂度:
O
(
N
2
)
O(N^{2})
O(N2)
空间复杂度:
O
(
l
o
g
N
)
O(logN)
O(logN),排序需要使用
O
(
l
o
g
N
)
O(logN)
O(logN) 的空间
- 最接近的三数之和
和15题类似,也是双指针,但是要比较绝对值大小
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int ans = nums[0] + nums[1] + nums[2];
for(int i = 0; i < nums.size(); i++){
int left = i + 1, right = nums.size() - 1;
while(left < right){
int sum = nums[i] + nums[left] + nums[right];
if(abs(sum - target) < abs(ans - target)){
ans = sum;
}
if(sum > target){
right--;
}else if(sum < target){
left++;
}else{
return ans;
}
}
}
return ans;
}
};
时间复杂度:
O
(
N
2
)
O(N^{2})
O(N2)
空间复杂度:
O
(
l
o
g
N
)
O(logN)
O(logN),排序需要使用
O
(
l
o
g
N
)
O(logN)
O(logN) 的空间