三数之和为0的三指针实现

for从来没有像这样用得如此混乱。

当循环变量在循环中要改变时,最好用while。

vector的clear()不仅会把值清掉,还会把内存清掉。务必注意。

FOR版本:

vector<vector<int> > threeSum(vector<int> &num) {
    int sz= num.size(); 
    vector<int> triplet(3);
    vector<vector<int> >res;
    if(sz<3) return res;
    int i,j,k;k=sz-1;
    sort(num.begin(),num.end());
    for(i=0;i<sz-2;){k=sz-1;
        for(j=i+1;j<sz-1 && j<k;){
            if(num[i]+num[j]+num[k]==0) {
                //triplet.clear();
                triplet[0]=num[i];
                triplet[1]=num[j];
                triplet[2]=num[k];
                res.push_back(triplet);
                while(j<k && num[j]==num[++j]);
                while(k>j && num[k]==num[--k]); }
            else if(num[i]+num[j]+num[k]<0) 
                ++j;
            else
                --k;
        }
        while(num[i]==num[++i]) ;
    }
    
    return res;
}
while版本

vector<vector<int> > threeSum(vector<int> &num) {
    int sz= num.size(); 
    vector<int> triplet(3);
    vector<vector<int> >res;
    if(sz<3) return res;
    int i=0,j,k;k=sz-1;
    sort(num.begin(),num.end());
    while(i<sz-2){
        k=sz-1;j=i+1;
        while(j<sz-1 && j<k){
            if(num[i]+num[j]+num[k]==0) {
                //triplet.clear();
                triplet[0]=num[i];
                triplet[1]=num[j];
                triplet[2]=num[k];
                res.push_back(triplet);
                while(j<k && num[j]==num[++j]);
                while(k>j && num[k]==num[--k]); 
                if(j>=k) break;
            }
            else if(num[i]+num[j]+num[k]<0) 
                ++j;
            else
                --k;
        }
        while(i<j && num[i]==num[++i]) ;
    }
    
    return res;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值