本文已参与「新人创作礼」活动,一起开启掘金创作之路。
15. 三数之和
- 题号:力扣15
- 知识点:数组,双指针
- 总结
题干:
思路:
- 1.首先对数组进行排序,为了后续使用双指针
- 2.使用一层遍历,这层遍历的数当作a,然后再定义左指针和右指针,分别对应b和c。
- 3.固定a的值,使用while循环,查找符合a+b+c=0的b和c的值。
- 4.难点:注意输出结果去重,去重方法,如果当前位置和上一个位置的数值一样的话,就跳过。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
// 数组长度不够
if (nums.size() < 3){
return {};
}
// 保存返回结果
vector<vector<int>> ret;
// 遍历排序之后的数组
for (int i = 0; i<nums.size(); i++){
// 如果最小的数已经大于0了,就直接返回
if (nums[i] > 0){
return ret;
}
// a去重
if (i>0 && nums[i] == nums[i-1]){
continue;
}
// b
int left = i+1;
// c
int right = nums.size() - 1;
while(right > left){
if (nums[i] + nums[left] + nums[right] > 0){
// 说明right大了
right--;
while(right>left && nums[right] == nums[right+1]) right--;
}
else if (nums[i] + nums[left] + nums[right] < 0){
// 说明left小了
left++;
while(right>left && nums[left] == nums[left-1]) left++;
}
else{
// 保存结果
ret.emplace_back(vector<int>{nums[i], nums[left], nums[right]});
// 向中间收缩
right--;
left++;
// 去重
while(right>left && nums[left] == nums[left-1]) left++;
while(right>left && nums[right] == nums[right+1]) right--;
}
}
}
return ret;
}
};