算法分析與設計——LeetCode Problem.40 Combination Sum II

問題詳情

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

Each number in C may only be used once in the combination.

Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:

[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

問題分析及思路

這道題有一種最簡單的做法就是將所有的子集全部求和並與其對比,但是這樣的計算量過大!下面使用遞歸,可以減小計算量。
需要注意的是如果有相同的數,且有解爲使用了兩個及以上的相同的數,則只能有一次計數,這次計數以第一個該數字爲基準。防止重複。


具體代碼

class Solution {
public:
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
        sort(num.begin(), num.end());
        vector<vector<int> > ret;
        vector<int> cur;
        Find(ret, cur, num, target, 0);
        return ret;
    }
    void Find(vector<vector<int> > &ret, vector<int> cur, vector<int> &num, int target, int position)
    {
        if(target == 0)
            ret.push_back(cur);
        else
        {
            for(int i = position; i < num.size() && num[i] <= target; i ++)
            {
                if(i != position && num[i] == num[i-1])
                    continue;
                cur.push_back(num[i]);
                Find(ret, cur, num, target-num[i], i+1);
                cur.pop_back();
            }
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章