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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40200779/article/details/84431103