题目描述
给你一个数组,任选3个数,其和等于0。返回全部的这3个数。不能包含一样的3元组。
解题思路
本题也是枚举,不过是如何快速的进行枚举。
要快速就要想到哈希或者二分。
先固定一个数,然后枚举另外2个数即可。为了实现双指针,就要先进行排序。
双指针:
left+right大于sum ,right到中间
小于sum,left到中间。
等于就是结果。是结果也不能跳出循环,因为和等于sum,会有多个。(这里也要进行去重的操作)
因为不能包含一样的,所以在固定数的时候,如果下一个与当前值相同就可以跳过。
代码
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> ret; sort(nums.begin(),nums.end()); int n=nums.size(); for(int i=0;i<n;i++) { int sum=-nums[i]; int left=i+1,right=n-1; //双指针 while(left<right) { if(nums[left]+nums[right]>sum) right--; else if(nums[left]+nums[right]<sum) left++; else { ret.push_back({nums[i],nums[left],nums[right]}); //去重 while(left+1<n&&nums[left]==nums[left+1]) left++; while(right-1>=0&&nums[right]==nums[right-1]) right--; left++,right--; } } //固定一个数的去重 while(i+1<n&&nums[i]==nums[i+1]) i++; } return ret; } };