首页 » 编程之美 » 正文

[leetcode_18]4Sum

给定数组,找出数组中4个数之和为目标数的所有不重复情况。
o(n^3*logn)险过。应该有更快的方法。

int cmp(int a,int b) {
    return a < b;
}
class Solution {
public:
    vector<vector<int> > fourSum(vector<int> &num, int target) {
        sort(num.begin(),num.end(),cmp);
        vector<vector<int>>ans;
        ans.clear();
        if(num.size() <= 3)return ans;
        for(int i = 0;i < num.size()-3;i++) {
            for(int j = i+1;j < num.size()-2;j++) {
                for(int k = j+1;k < num.size()-1;k++) {
                    int val = target - (num[i] + num[j] + num[k]);
                    if(val >= num[k+1] && findTarget(k+1,num.size()-1,val,num)) {
                        vector<int>item;
                        item.clear();
                        item.push_back(num[i]);
                        item.push_back(num[j]);
                        item.push_back(num[k]);
                        item.push_back(val);
                        if(!checkExist(ans,item))
                            ans.push_back(item);
                    }
                }
            }
        }
        return ans;
    }<br />
private:
    bool checkExist(vector&lt;vector&lt;int&gt;&gt;&amp;ans,vector&lt;int&gt;&amp;item) {
        for(int i = 0;i &lt; ans.size();i++) {
            if(item == ans[i])return true;
        }
        return false;
    }
    bool findTarget(int left,int right,int target,vector&lt;int&gt;&amp;num) {
        if(left &gt; right)return false;
        int mid = (left + right) / 2;
        if(num[mid] == target)return true;
        else
            if(num[mid] &gt; target) {
                return findTarget(left,mid-1,target,num);
            }
            else {
                return findTarget(mid+1,right,target,num);
            }
    }
};

发表评论