15.三数之和
排序后,利用指针一前一后扫描,使复杂度从n的三次方一直到n的平方
下面是两种不同的写法,但思路是一样的(推荐第一种,与16.最接近的三数之和的思路和写法一样,可以当成一种板子)
1.
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector <vector<int> > ans; sort(nums.begin(), nums.end()); for(int i = 0; i < nums.size(); i ++) { if(i && nums[i] == nums[i-1]) continue; int j = i + 1, k = nums.size() - 1; while(j < k) { int sum = nums[i] + nums[j] + nums[k]; if(sum == 0) { ans.push_back({nums[i], nums[j], nums[k]}); while(j < k && nums[j] == nums[j+1]) j++; while(j < k && nums[k] == nums[k-1]) k--; j++; k--; } else if(sum > 0) k--; else if(sum < 0) j++; } } return ans; } };
2.
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector <vector<int> > ans; sort(nums.begin(), nums.end()); for(int i = 0; i < nums.size(); i ++) { if(i && nums[i] == nums[i-1]) continue; for(int j = i+1, k = nums.size()-1; j < k; j++) { if(j > i+1 && nums[j] == nums[j-1]) continue; while(j < k-1 && nums[i]+nums[j]+nums[k-1] >= 0) k--; //先判断, 后进行匹配 if(nums[i] + nums[j] + nums[k] == 0) ans.push_back({nums[i], nums[j], nums[k]}); } } return ans; } };