LeetCode15三數和2018_11.24_11.30
阿新 • • 發佈:2018-12-31
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<int> temp;
set<vector<int>> res;
vector<vector<int>> ret;
sort(nums.begin(),nums.end());
if(nums.empty()||nums.size()<3) return ret;
if(nums[ 0]+nums[1]+nums[2]==0){
temp.push_back(nums[0]);
temp.push_back(nums[1]);
temp.push_back(nums[2]);
ret.push_back(temp);
return ret;
}
for(int i=0;i<nums.size();i++){
//while(i+1<nums.size()&&nums[i+1]==nums[i]){
// i++;
//} i跳過去 把-1,-1,2漏掉,不跳過去產生二個-1,0,-1
for(int j=i+1;j<nums.size();j++){
//while(j+1<nums.size()&&nums[j+1]==nums[j]){
// j++;
//} //2,...,-1,-1不能通過 不能跳過
for(int k=j+1;k<nums.size();k++){
while(k+1<nums.size()&&nums[k+1]==nums[k]){
k++;
}
if (nums[i]+nums[j]+nums[k]==0){
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
res.insert(temp);
vector<int>().swap(temp);
}
}
}
}
for(auto iter=res.begin();iter!=res.end();++iter){
ret.push_back(*iter);
}
return ret;
}
};
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) { //-4,-1,-1,0,1,2
vector<int> temp;
vector<vector<int>> res;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
if(i-1>=0&&nums[i]==nums[i-1]) continue; //i不能跳,i跳了,-1,-1,...,2會漏掉-1,-1,2//i不跳-1,-1,-1,...,...,2又會出現重複
int first=i+1; //只需要當i指向第一個-1時的可行結果
int second=nums.size()-1;
while(first<second){
if(nums[i]+nums[first]+nums[second]>0) second--;
if(nums[i]+nums[first]+nums[second]<0) first++;
if(nums[i]+nums[first]+nums[second]==0){
if(first<second){ // -4,...,2這種情況下會把-4,2,2也加進去//上面兩行行執行完後,不能保證first<second,
while(first+1<nums.size()&&nums[first+1]==nums[first]){//不能保證first和second是不同的二個數,需要再次進行判斷
first++; //如果調換順序,則不需要加if(first<second)這一句,在上面的while中已經有判斷
}
while(second-1>=0&&nums[second-1]==nums[second]){
second--;
}
temp.push_back(nums[first]);
temp.push_back(nums[second]);
temp.push_back(nums[i]);
res.push_back(temp);
first++; // 別忘了
second--; //
// vector<int>.swap(temp);
vector<int>().swap(temp);
}
}
}
}
return res;
}
};
稍作改進
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<int> temp;
vector<vector<int>> res;
sort(nums.begin(),nums.end());
if(nums.empty()||nums[nums.size()-1]<0) return res;
for(int i=0;i<nums.size()-1;i++){
if(nums[i]>0) break; //////////
if(i-1>=0&&nums[i]==nums[i-1]) continue;
int first=i+1;
int second=nums.size()-1;
while(first<second){
if(nums[i]+nums[first]+nums[second]>0) second--;
if(nums[i]+nums[first]+nums[second]<0) first++;;
if(nums[i]+nums[first]+nums[second]==0){
if(first<second){
while(first+1<nums.size()&&nums[first+1]==nums[first]){
first++;
}
while(second-1>=0&&nums[second-1]==nums[second]){
second--;
}
temp.push_back(nums[first]);
temp.push_back(nums[second]);
temp.push_back(nums[i]);
res.push_back(temp);
first++;
second--;
// vector<int>.swap(temp);
vector<int>().swap(temp);
}
}
}
}
return res;
}
};
再次改進:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<int> temp;
vector<vector<int>> res;
sort(nums.begin(),nums.end());
if(nums.empty()||nums[nums.size()-1]<0) return res;
for(int i=0;i<nums.size()-1;i++){
if(nums[i]>0) break;
if(i-1>=0&&nums[i]==nums[i-1]) continue;
int first=i+1;
int second=nums.size()-1;
while(first<second){
int target=nums[i]+nums[first]+nums[second]; //////////制約耗時的主要因素
if(target>0) second--; //////////
if(target<0) first++; //////////
if(target==0){ //////////
if(first<second){
while(first+1<nums.size()&&nums[first+1]==nums[first]){
first++;
}
while(second-1>=0&&nums[second-1]==nums[second]){
second--;
}
temp.push_back(nums[first]);
temp.push_back(nums[second]);
temp.push_back(nums[i]);
res.push_back(temp);
first++;
second--;
// vector<int>.swap(temp);
vector<int>().swap(temp);
}
}
}
}
return res;
}
};