15.三数之和文章来源:https://www.toymoban.com/news/detail-807024.html
我的解法:文章来源地址https://www.toymoban.com/news/detail-807024.html
- 预处理
- 当nums大小小于3时,直接返回空的res
- 对nums排序后,若首元素小于0或末尾元素大于0,也直接返回空的res
- 双指针法找出三元组(nums[i]、nums[left]和nums[right])
- i从0开始取值,对于每个i,判断是否存在三元组和为0的left(初值为i+1)和right(初值为n-1)
- nums[i]+nums[left]+nums[right]<0时,左移left
- nums[i]+nums[left]+nums[right]>0时,右移right
- nums[i]+nums[left]+nums[right]=0时,将三元组下标插入res中
- 注意排除重复的三元组,因此找到和为0的三元组后,要while循环判断下一步的left和right值是否重复,重复则直接跳过
- 外部的while循环:每轮都是找出当前i是否存在满足题意的三元组,每轮结束后也要判断用while循环跳过重复的i
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> res;
if(n < 3){
return res;
}
sort(nums.begin(), nums.end());
if(nums[0] > 0 || nums[n - 1] < 0){
return res;
}
int i = 0, left, right = n - 1;
while(i < n){
if(nums[i] > 0){
break;
}
left = i + 1;
right = n - 1;
while(left < right){
if(nums[i] + nums[left] < -nums[right]){
left++;
}
else if(nums[i] + nums[left] > -nums[right]){
right--;
}
else{
res.push_back({nums[i], nums[left], nums[right]});
left++;
right--;
while(left < right && nums[left - 1] == nums[left]){
left++;
}
while(left < right && nums[right + 1] == nums[right]){
right--;
}
}
}
i++;
while(i < n && nums[i] == nums[i - 1]){
i++;
}
}
return res;
}
};
到了这里,关于面试经典题---15.三数之和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!