PROBLEM

15. 三数之和

难度 中等

MY ANSWER

无。

BETTER SOLUTION

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

img

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

使用双指针遍历排序数组,降低时间复杂度。