三数之和
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> result; sort(nums.begin(), nums.end()); for(int i = 0; i < nums.size(); i++){ //排序后第一个元素如果大于0,无论如何相加都不可能等于0 if (nums[i] > 0) { return result; } //去重复值,第一个值,a,就是nums[i]如果和上次循环的nums[i]相等,则去重 if(i > 0 && nums[i] == nums[i - 1]){ continue; } int left = i + 1; int right = nums.size() - 1; //构造左指针和右指针 //双指针查找 while(right > left){ if((nums[i] + nums[left] + nums[right]) > 0) right--; //大于0说明右边界大了,右指针收缩 else if((nums[i] + nums[left] + nums[right]) < 0) left++; //小于0说明左边界小了,左指针收缩 else{ result.push_back(vector<int>{nums[i], nums[left], nums[right]}); //说明该三元组成立。此时a的去重已经完成,对b,c进行去重 while(right > left && nums[right] == nums[right - 1] ) right--; //说明该右边界的左位和当前值相等,左移直到不相等,去重复值 while(right > left && nums[left] == nums[left + 1] ) left++; //同理,对左边界去重 // 找到答案时,双指针同时收缩,找下一位 right--; left++; } } } return result; } };
这道题反而是哈希法的去重我看半天没看明白,双指针法豁然开朗。因为顺序排列,所以重复值肯定是排在一起的。去重只要对每个指针挨个移位就行。
标签:right,nums,指针,vector,result,Day12,刷题,LeetCode,left From: https://www.cnblogs.com/tianmaster/p/16882350.html