3Sum

来源:互联网 发布:遗传算法中的objv 编辑:程序博客网 时间:2024/05/18 00:56

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 = =

0 0
原创粉丝点击