1. 程式人生 > >LeetCode-40. Combination Sum II

LeetCode-40. Combination Sum II

date can 操作 auto http cto div fin 沒有

一、問題描述

  這個題目是39題的拓展,本題中,給定的數組有可能有重復元素,要求最後結果不能有重復。

二、問題解決

  思路一:在向result中添加結果的時候,做一個判斷去重

void find2(vector<int>& candidates, int target, int begin, vector<vector<int>> &result, vector<int>& thistime) {
    if (target == 0) {
        //遍歷result,看有沒有和thistime相等的結果,有則直接返回
int k; for (int j = 0; j < result.size(); j++) { if (result[j].size() == thistime.size()) { for (k = 0; k < thistime.size(); k++) { if (thistime[k] != result[j][k]) break; } }
else continue; if (k == result[j].size()) return; } result.push_back(thistime); return; } for (int i = begin; i < candidates.size() && candidates[i] <= target; ++i) { thistime.push_back(candidates[i]); find2(candidates, target
- candidates[i], i+1, result, thistime); thistime.pop_back(); } } vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { sort(candidates.begin(), candidates.end()); vector<vector<int>> result; vector<int> thistime; find2(candidates, target, 0, result, thistime); return result; } //這是測試用例 int main() { vector<int> v = { 10, 1, 2, 7, 6, 1, 5 }; vector<vector<int>> result = combinationSum2(v,8); for (auto i : result) { for (auto j : i) { cout << j; } cout << endl; } system("pause"); return 0; }

  思路二:再進行添加-遞歸-刪除操作之前做一個判斷,如果是重復的,則直接跳過該值

  std::vector<std::vector<int> > combinationSum2(std::vector<int> &candidates, int target) {
        std::sort(candidates.begin(), candidates.end());
        std::vector<std::vector<int> > res;
        std::vector<int> combination;
        combinationSum2(candidates, target, res, combination, 0);
        return res;
    }

    void combinationSum2(std::vector<int> &candidates, int target, std::vector<std::vector<int> > &res, std::vector<int> &combination, int begin) {
        if (!target) {
            res.push_back(combination);
            return;
        }
        for (int i = begin; i != candidates.size() && target >= candidates[i]; ++i)
            if (i == begin || candidates[i] != candidates[i - 1]) {
                combination.push_back(candidates[i]);
                combinationSum2(candidates, target - candidates[i], res, combination, i + 1);
                combination.pop_back();
            }
    }

三、問題思考

  在這題中,if (i == begin || candidates[i] != candidates[i - 1])這個判斷寫法很簡潔,即避免了開頭的判斷,又可以簡單去重

LeetCode-40. Combination Sum II