题目给定一个输入vector,要求找出任意三个数和为0的任意组合,组合不可重复。
这个题目基本也就只想到前面的排序,看了一个submit,整理了一下思路:首先排序,然后通过一个O(N^2)的遍历,加上一个尾指针,完成对所有数字的可能组合的判断
但是在"指针"移动的过程中需要考虑到重复数字,即找到一个组合之后j、k需要到达不重复的新位置,以及i到下一次循环的时候也要避开重复数字,这里踩了坑,看了第二遍
代码才发现自己的问题。
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> result; if(nums.empty()) return result; sort(nums.begin(),nums.end()); int sum; int j,k; for(int i=0;i<nums.size()-1;i++) { if(i>0&&nums[i]==nums[i-1]) continue; j=i+1; k=nums.size()-1; while(j<k) { sum = nums[i] + nums[j] + nums[k]; if(sum > 0) k--; else if(sum < 0) j++; else { result.push_back(vector<int>{nums[i],nums[j],nums[k]}); while(j<k-1&&nums[j]==nums[j+1]) j++; while(k>j&&nums[k]==nums[k-1]) k--; j++; k--; } } } return result; } };
原文:https://www.cnblogs.com/jianbo1995/p/10770901.html