一:题目
二:思路
1.这里的去重是指的是我们在遍历元素的时候,遇到相同的挨着的相同的元素的时候要跳过
2.对元素进行排序,为了后面的比较
3.我们用的是三个指针,第一个指针i指向第一个元素,第二个指针left指向第二个元素,第三个指针left指向
的是最后的一个元素.
4.nums[i] + nums[left] + nums[right] > 0, 则right–
nums[i] + nums[left] + nums[right] < 0, 则left++
nums[i] + nums[left] + nums[right] == 0, 则right-- left++ 同时i继续往下遍历
三:上码
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {/**思路:1.这里的去重是指的是我们在遍历元素的时候,遇到相同的挨着的相同的元素的时候要跳过2.对元素进行排序,为了后面的比较3.我们用的是三个指针,第一个指针i指向第一个元素,第二个指针left指向第二个元素,第三个指针left指向的是最后的一个元素.4.nums[i] + nums[left] + nums[right] > 0, 则right--nums[i] + nums[left] + nums[right] < 0, 则left++nums[i] + nums[left] + nums[right] == 0, 则right-- left++ 同时i继续往下遍历*/vector<vector<int>>ans;vector<int> v;sort(nums.begin(),nums.end());for(int i = 0; i < nums.size(); i++) {if(nums[i] > 0){//如果最小的数都是大于0的,那么就不会有三元组return ans;}//这是对nums[i]的去重处理if(i > 0 && nums[i] == nums[i-1]){continue;}int left = i+1;int right = nums.size()-1;//这是一个nums[i] 跟多个不同的nums[left]和nums[right]进行匹配 while(left < right){if(nums[i] + nums[left] + nums[right] > 0) right--;else if(nums[i] + nums[left] + nums[right] < 0) left++;else{v.push_back(nums[i]);v.push_back(nums[left]);v.push_back(nums[right]);ans.push_back(v);//对nums[left]进行去重while(left < right && nums[left] == nums[left+1]) left++;//对nums[right]进行去重while(left < right && nums[right] == nums[right-1]) right--;//当找到一组合适的答案后left++;right--;v.clear();//为下次装进合适的答案做准备}}}return ans;}
};