暴力算法必须贴,虽然超时了,但我真的觉得是个好办法
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> result; int n = nums.size(); if(n<=2) return result; vector<int> temp; for(int i = 0 ; i < n-2 ; i++) { for(int j = i+1 ; j < n-1 ; j++) { for(int k = j+1 ; k<n ; k++) { if(nums[i] + nums[j] + nums[k] == 0) { temp = {nums[i],nums[j],nums[k]}; sort(temp.begin(),temp.end()); result.push_back(temp); } } } } sort(result.begin(),result.end()); result.erase(unique(result.begin(),result.end()),result.end()); return result; } };
排序是个好思路,先把所有数据从小到达排序,进行第二个循环的时候b和c可以同步进行,一个从前往后,一个从后往前
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> result; int n = nums.size(); if(n<=2) return result; sort(nums.begin(),nums.end()); vector<int> temp; int i = 0; for(int i = 0 ; i < n-2 ; i++) //第一位不一样 { if(i > 0 && nums[i] == nums[i-1]) continue; int k = n-1; for(int j = i+1 ; j < n-1 ; j++) //对j循环 { if(j > i+1 && nums[j] == nums[j-1]) //保证第二个数不重复 continue; while(j < k && nums[i]+nums[j]+nums[k]>0) { k--; } if(j == k) break; if(nums[i]+nums[j]+nums[k] == 0) result.push_back({nums[i],nums[j],nums[k]}); } } return result; } };