3Sum

Two pointers问题。留心一个问题,num.size()返回的是无符号数。当其值为1,i==0时,i<num.size()-2本应该不成立退出循环的,但num.size()-2是无符号数,等于(unsigned int)-1,导致循环条件成立

class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<vector<int>> res;
        if(num.empty())
            return res;
        sort(num.begin(),num.end());
        int i,j,k;
        vector<int> tmp;
        int n = num.size();
        for(i=0;i<n-2;i++)
        {
            if(i>0&&num[i]==num[i-1])
                continue;
            j = i+1;
            k = num.size()-1;
            while(j<k)
            {
                while(j<k&&j>i+1&&num[j]==num[j-1])
                    j++;
                while(j<k&&k<n-1&&num[k]==num[k+1])
                    k--;
                if(j>=k)
                    break;
                if(num[i]+num[j]+num[k]==0)
                {
                    tmp.clear();
                    tmp.push_back(num[i]);
                    tmp.push_back(num[j]);
                    tmp.push_back(num[k]);
                    res.push_back(tmp);
                    j++;
                    k--;
                }else if(num[i]+num[j]+num[k]>0)
                    k--;
                else j++;
            }
        }

        return res;
        
        
    }

  

posted @ 2013-10-03 23:12  summer_zhou  阅读(137)  评论(0编辑  收藏  举报