1. 程式人生 > >LeetCode15三數和2018_11.24_11.30

LeetCode15三數和2018_11.24_11.30

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;
	}
};

在這裡插入圖片描述