PROBLEM
15. 三数之和
难度 中等
MY ANSWER
无。
BETTER SOLUTION
先排序,然后确定第一个数,使用双指针遍历第二和第三个数,左指针指向头右指针指向尾,和小于0则增加左指针,大于0则减少右指针,遇到重复数则跳过。时间复杂度O(n^2),空间复杂度O(1)。

class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res; if(nums.empty() || nums.size() < 3) { return res; } sort(nums.begin(), nums.end()); for(int i = 0; i < nums.size() - 2; i++) { if(nums[i] > 0) { break; } int j = i + 1, k = nums.size() - 1, sum = 0; while(j < k) { sum = nums[i] + nums[j] + nums[k]; if(sum == 0) { vector<int> ans = {nums[i], nums[j], nums[k]}; res.push_back(ans); while(j < k && nums[j] == nums[j+1]) { j++; } j++; } else if(sum > 0) { while(j < k && nums[k] == nums[k-1]) { k--; } k--; } else { while(j < k && nums[j] == nums[j+1]) { j++; } j++; } } while(i < nums.size() - 1 && nums[i] == nums[i+1]) { i++; } } return res; } };
|
SUMMARY
使用双指针遍历排序数组,降低时间复杂度。