LeetCode刷题笔记----P15 three sum
0.问题描述
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Notice that the solution set must not contain duplicate triplets.
1.其他方法
首先思考暴力法是否能解决,发现并不理想,时间复杂度高(O(n3))的情况下,去重也不方便。
然后想到之前做的two sum中的哈希法,发现并不适合此处的three sum,去重太多情况,太复杂。
2.双指针
1.0
具体思路:先对nums进行排序,固定一个指针i,其余两个指针j、k分别指向i+1和末尾,若三数之和大于0,则k–;若三数之和小于0,则j++
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
int j,k;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
j=i+1;
k=nums.size()-1;
while(j<k){
if(nums[i]+nums[j]+nums[k]>0)
k--;
else if(nums[i]+nums[j]+nums[k]<0)
j++;
else{
vector<int> answer;
answer.push_back(nums[i]);
answer.push_back(nums[j]);
answer.push_back(nums[k]);
result.push_back(answer);
j++;k--;
}
}
}
return result;
}
还是没能解决去重问题,留到2.0吧,下班啦,吃饭去啦~
2.0
具体去重方案如下:
1.不对同一个a考虑,如:-4 -1 -1 0 1 2,在确定a时,不考虑两次-1
2.在寻找到一个三元组后,把相同的b、c跳过,如:-2, -1, -1,3, 3
[-2,-1,3]符合规则,第二个应该[-2,-1,3]跳过
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
int j,k;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
//第一次去重:不对同一个a进行考虑
if(i!=0&&nums[i]==nums[i-1]) continue;
j=i+1;
k=nums.size()-1;
while(j<k){
if(nums[i]+nums[j]+nums[k]>0)
k--;
else if(nums[i]+nums[j]+nums[k]<0)
j++;
else{
vector<int> answer;
answer.push_back(nums[i]);
answer.push_back(nums[j]);
answer.push_back(nums[k]);
result.push_back(answer);
j++;k--;
//第二次去重:去除b、c中相等的数
while(j<k&&nums[j-1]==nums[j]) j++;
while(j<k&&nums[k+1]==nums[k]) k--;
}
}
}
return result;
}
结束~