Tony's Log

Algorithms, Distributed System, Machine Learning

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

4 Pointer solution. Key: when moving pointers, we skip duplicated ones.

Ref: https://github.com/xbz/lintcode/blob/master/4_sum/4sum.cpp

class Solution {
    void nextUnique(vector<int> &num, size_t &j)
    {
        while (j<num.size() && num[j]==num[j-1]) ++j;
    }
public:
    vector<vector<int> > fourSum(vector<int> &num, int target) 
    {
        vector<vector<int> > ret;
        sort(num.begin(), num.end());
        
        for (size_t i=0; i<num.size(); ++i) 
        {
            if(i > 0) nextUnique(num, i);

            for (size_t j=i+1; j<num.size(); ++j) 
            {
                if(j>i + 1) nextUnique(num, j);

                size_t m = j + 1;
                size_t n = num.size() - 1;
                while (m < n) {
                    int sum = num[i] + num[j] + num[m] + num[n];
                    if (sum == target) 
                    {
                        vector<int> v = {num[i], num[j], num[m], num[n]};
                        ret.push_back(v);
                        m++;
                        n--;

                        if(m>j+1) nextUnique(num, m);
                        while (n<num.size()-1 && m<n && num[n]==num[n+1]) n--;
                    } else if (sum < target)
                        ++m;
                    else
                        --n;
                }
            }
        }
        return ret;
    }
};
View Code

 

posted on 2015-10-24 09:17  Tonix  阅读(144)  评论(0编辑  收藏  举报