根本原理就是排序后从第一个数开始先确定一个数字,然后从剩下的数字中找两数之和,直接放带注释的AC代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());//排个序先
vector<vector<int>>ans;
if (nums.size() < 3)return ans;//特殊情况排除
for (vector<int>::iterator first = nums.begin(); first < nums.end(); first++)
{
if (*first > 0)return ans;//若是排序后第一个数都大于0,那确实没法玩了
if (first > nums.begin() && *first == *(first - 1))continue;//去重
//开始进入第二层,确定第一个数,然后求两数之和
vector<int>::iterator second = first+1, third = nums.end() - 1;
while (second < third)
{
if (*second == *(second - 1) && second - 1 != first) { second++; continue; }//去重
if (third + 1 < nums.end() && *third == *(third + 1)) { third--; continue; }//去重
if (*second + *third > -*first)third--;//偏大
else if (*second + *third < -*first)second++;//偏小
else {
ans.push_back({ *first,*second,*third });
second++;
third--;
}
}
}
return ans;
}
};
因为使用迭代器的原因,时空复杂度很低: