// left是当前可用的左括号数,right是当前可用的右括号数,思路就是从左到右地找每一种可能。 // 当前,如果left==right的话,下一个字符一定只能是“(” //如果left<right并且都大于0,下一个字符有两种可能 //如果left=0而right还有,下一个字符只能是“)” //当left==right==0时,递归终点,完成了一个串的构造,把它放入result中。 //beats 100%,0.00ms。 class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(),nums.end()); vector<vector<int>> result; for(int i=0;i<nums.size();i++){ if(nums[i]>0) break; if(i>0 && nums[i]==nums[i-1]) continue; int left=i+1,right=nums.size()-1; while(left<right){ int sum=nums[left]+nums[right]+nums[i]; if(sum>0){ right--; } else if(sum<0){ left++; } else{ result.push_back({nums[i],nums[left],nums[right]}); int l=nums[left]; int r=nums[right]; while(left<right&&nums[left]==l) left++; while(right>left&&nums[right]==r) right--; } } } return result; } };
原文:https://www.cnblogs.com/rarecu/p/11520938.html