介绍
分析
1.双指针+固定一个数
首先明白一点,我们有三个数,我们想使用双指针,那就必须固定一个数。
2.二分
本题还涉及二分,双指针经常和二分结合使用(二分本质就是双指针,仔细思考这思考这句话),所以我们要在一开始先排序。
3.去重
题目要求答案不可包含重复的三元组,那么就必须考虑去重。
又分两种情况:
1.对固定的数来说,用当前数和前一个数比较,相同直接跳过本次了。
2.对后两个数,只需要考虑当双指针找到了一次对应目标后,把可能重复的数字跳过去。
明确了思路,代码就非常好写了。
cpp代码
cpp
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//一是固定数+双指针,二是二分,三是去重
vector<vector<int>> res;
if(nums.size()<3) return res;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
if(nums[i]>0) break;
if(i>0&&nums[i]==nums[i-1]) continue;
int j=i+1,k=nums.size()-1;
while(j<k)
{
if(nums[i]+nums[j]+nums[k]==0)
{
res.push_back({nums[i],nums[j],nums[k]});
while(j<k && nums[j]==nums[j+1]) j++;
while(j<k && nums[k]==nums[k-1]) k--;
j++;
k--;
}
else if(nums[i]+nums[j]+nums[k]<0)
{
j++;
}
else
{
k--;
}
}
}
return res;
}
};
流程
是 否 指针相遇 未相遇 和小 和大 开始 输入数组 数组排序 固定第一个数 双指针查找 找到解? 保存结果 继续查找 固定下一数 判断和大小 左指针右移 右指针左移