C++、双指针
本题主要利用双指针,在确定一个数据的基础上,利用双指针确定另外两个数据。复杂在于不得重复,即去重语句的考虑。若添加位置错误或考虑欠缺,则会导致结果的减少或重复。
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > ans;
int n = num.size();
if (n < 3)
return ans;
sort(num.begin(), num.end());//题目要求有序,而且排序后更加便于查找符合要求的三元组
for (int i = 0; i < n; i++) {
if (num[i] > 0)//排序后第一个元素大于零,则全部大于零,直接返回。
break;
if (i > 0 && num[i] == num[i - 1])
continue;//去重
int left = i + 1, right = n - 1;
while (right > left) {//可以看作一种去重,主要为循环终止条件
if (num[left] + num[right] + num[i] > 0)
right--;
else if(num[left] + num[right] + num[i] < 0)//注意此处的else不可省略,否则只能判断一次num[left] + num[right] + num[i]>0是否成立,这样显然会多录入几组不符合要求的结果,出错
left++;
else {
ans.push_back({num[i], num[left], num[right]});
while(right > left && num[left] == num[left + 1])
left++;
while(right > left && num[right] == num[right - 1])
right--;//注意以上两个去重语句的位置,加入提前放置,则会导致录入的数据少(例如,若为num数组为{1,1,1},则若去重语句位置提前,则1,1,1不会录入)
left++;
right--;
}
}
}
return ans;
}
};
京公网安备 11010502036488号