Leetcode刷题记录
15. 三数之和
注意到和为0,当一个数确定以后,另外两个一定是围绕它一大一小。
排除重复:排序
两数之和:双指针
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> res;
if(nums.size()<3) return res;
//先固定一个值
for(int i=0; i<nums.size()-2; i++){
if(i && nums[i]==nums[i-1]) continue;
//固定下一个值
//随着j的增长,k只会往左移,因此不需要每次都从n-1开始,每轮判断结束后从当前位置再往左判断即可
int k=nums.size()-1;
for(int j=i+1; j<nums.size()-1; j++){
//每次跳到不相等的下一个值开始新的一轮
if(j>i+1 && nums[j]==nums[j-1]) continue;
//最后一个指针从右向左移动
while(j<k && nums[j]+nums[k]>-nums[i]) k--;
//移动到第二个指针左边,则没有找到
if(k==j) break;
if(nums[j]+nums[k]==-nums[i]){
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
res.push_back(temp);
}
}
}
return res;
}
};