三数之和
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请
你返回所有和为 0
且不重复的三元组。
**注意:**答案中不可以包含重复的三元组。
MyCode
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> anses;
int n = nums.size();int i;int j;int flag;
if(n<3)return anses;
int k=0;
while(k<n-2&&nums[k]<=0){
i=k+1;j=n-1;
while(i<j){
if(nums[k]+nums[i]+nums[j]==0){
vector<int> ans;
ans.push_back(nums[k]);ans.push_back(nums[i]);ans.push_back(nums[j]);
flag=0;
// for(int q=0;q<anses.size();q++){
// if(anses[q]==ans)flag=1;
// }
// if(flag==0)anses.push_back(ans);
anses.push_back(ans);
if(nums[k]==0&&nums[i]==0){
return anses;
}
while (i < j && nums[i] == nums[j + 1])
i++;
// 避免重复的右指针元素
while (i < j && nums[j] == nums[j - 1])
j--;
i++; // 左指针右移一位
j--; // 右指针左移一位
// i++;
// j--;
}else{
if(nums[k]+nums[i]+nums[j]<0){
i++;
// 避免重复的右指针元素
}else {
j--;
}
}
}
do{
++k;
}while(k<n-2&&nums[k]<=0&&nums[k]==nums[k-1]);
}
return anses;
}
};
思路挺好想的,就是实现不了排除i路径上重复元素……每次都超时。最后几十个数据集过不去。明明我写的和某些优秀答案思路一致,好想杀人