1 static int wing=[]() 2 { 3 std::ios::sync_with_stdio(false); 4 cin.tie(NULL); 5 return 0; 6 }(); 7 8 class Solution 9 { 10 public: 11 vector<vector<int>> threeSum(vector<int>& nums) 12 { 13 vector<vector<int>> res; 14 int sz=nums.size(); 15 sort(nums.begin(),nums.end()); 16 int target,left,right,sum; 17 for(int i=0;i<sz;i++) 18 { 19 if(nums[i]>0) 20 break; 21 if(i>0&&nums[i-1]==nums[i]) 22 continue; 23 target=-nums[i]; 24 left=i+1; 25 right=sz-1; 26 while(left<right) 27 { 28 sum=nums[left]+nums[right]; 29 if(sum==target) 30 { 31 res.push_back({nums[i],nums[left],nums[right]}); 32 left++; 33 while(left<right&&nums[left]==nums[left-1]) 34 left++; 35 right--; 36 while(left<right&&nums[right]==nums[right+1]) 37 right--; 38 } 39 else if(sum<target) 40 left++; 41 else 42 right--; 43 } 44 } 45 return res; 46 } 47 };
先排序,以一个元素为扫描基准,在该元素右侧查找两个元素,使得这两个元素的和为当前扫描元素的相反数。将三和问题转化为二和问题,时间复杂度O(n²)