基本思想:排序后,遍历+左右双指针,指针跳过重复元素。 关联题:两数之和
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if(nums.size()<3) return res;
sort(nums.begin(),nums.end());//排序
for(vector<int>::iterator i=nums.begin();i!=nums.end()-2;){
//当这个排序后的数组第一个元素大于0时,返回空
int temp=*i;
if(temp>0) break;
//让一个数从左到右遍历一遍
int target=0-temp;
vector<int>::iterator left=i+1;
vector<int>::iterator right=nums.end()-1;
while(left<right){
if(*right<0) break;
if(*left+*right<target){
int v=*left;
while(left!=right&&*left==v) left++;
}else if(*left+*right>target){
int v=*right;
while(right!=left&&*right==v) right--;
}else{
vector<int> temp_res{temp,*left,*right};
res.push_back(temp_res);
int v= *left;
while(left != right && *left == v) left++;//跳过相等的元素
v= *right;
while(left != right && *right == v) right --;//跳过相等的元素
}
}
while(i!=nums.end()-2&&*i==temp) i++;
}
return res;
}
};
使用的STL:C++ vector迭代器、vector插入元素、sort()