排序+双指针的方法是很容易想到的
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
vector<vector<int>> ans;
for (int first = 0; first < n;first++)//第一重循环
{
if (nums[first] > 0)
break;
if (first > 0 && nums[first] == nums[first - 1])
continue;//判断是否开始第二重循环
int third = n - 1;
int target = -nums[first];
for (int second = first + 1; second < n; second++)
{
if (second > first+1 && nums[second] == nums[second - 1])
continue;//判断是否开始第三重循环
while (third > second && nums[second] + nums[third] > target)
--third;
if (third==second)
break;
if (nums[second] + nums[third] == target)
{
ans.push_back({ nums[first], nums[second], nums[third] });//不用判断third重复
}
}
}
return ans;
}
};
这样才能把时间复杂度降低到O(N^2)
O(N^3)的情况是一定会超时不通过的