介紹
題源
分析
1.雙指針+固定一個數
首先明白一點,我們有三個數,我們想使用雙指針,那就必須固定一個數。
2.二分
本題還涉及二分,雙指針經常和二分結合使用(二分本質就是雙指針,仔細思考這思考這句話),所以我們要在一開始先排序。
3.去重
題目要求答案不可包含重復的三元組,那么就必須考慮去重。
又分兩種情況:
1.對固定的數來說,用當前數和前一個數比較,相同直接跳過本次了。
2.對后兩個數,只需要考慮當雙指針找到了一次對應目標后,把可能重復的數字跳過去。
明確了思路,代碼就非常好寫了。
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;}
};