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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值