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

3438

被折叠的 条评论
为什么被折叠?



