3Sum

3Sum, 依然是排序之后最里层的二分,而且这次不需要原index因此更简单些。

vector<vector<int> > threeSum(vector<int> &num) {
		vector<vector<int>> tuplesets;
		if(num.size()<=2)return tuplesets;
		sort(num.begin(),num.end());
        int repeatedi=num.at(0),repeatedj=num.at(1);
        for(int i=0;i<num.size();i++)
		{
			if(i!=0&&num.at(i)==repeatedi)
				continue;
			repeatedi=num.at(i);
			for(int j=i+1;j<num.size();j++)
			{
				if(j!=1&&num.at(j)==repeatedj)
					continue;
				repeatedj=num.at(j);
				int query=0-num.at(i)-num.at(j);
				int low=j+1,high=num.size()-1;
				while(low<=high)
				{
					int mid=(low+high)/2;
					if(num.at(mid)<query)
						low=mid+1;
					else if(query<num.at(mid))
						high=mid-1;
					else
					{
						vector<int> vec;
						vec.push_back(num.at(i));
						vec.push_back(num.at(j));
						vec.push_back(num.at(mid));
						tuplesets.push_back(vec);
						break;
					}
				}
			}
		}
		return tuplesets;
    }

这个代码在写的时候,出现几种问题,二分找到的case里没有返回,在这里就是break出来,因为操作在里面完成。二分有两种出口,一种是找不到,low>high,一种是找到,所以尤其是嵌入其他的代码里时,特别要想清楚出口怎么设计。

而且包括fawks大神在内都提醒过我,用的变量在用的时候直接定义赋值,不要离得那么远,不要考虑每次循环申请那么多变量的问题(尽管我一直这么担心的)

然后里面还有判unique的部分,我想想发现只要外两层循环跳过重复的变量就可以保证不漏掉,也不会重复,大家可以想想为什么,昨天想了下是这样的。另外发现设置repeated元素时发现第一次loop会出现问题,因此设置大神设置firstflag,多次经验表明变量越多越可能出bug,因此尽量少变量,其实用i=0 j=0就可以了,我之前就喜欢设计一些奇奇怪怪的bool变量做flag = =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值