LeetCode 40. Combination Sum II

問題連接

LeetCode 40. Combination Sum IIhtml

題目解析

給一組數和一個目標值,求和爲目標值的組合。數組中的每一個數最多隻能取一次。數組

解題思路

本題與上一題LeetCode 39. Combination Sum十分類似,改變的條件是:數組中每一個元素最多隻能取一次code

在上一題中,咱們是經過能夠同一個起點(start)反覆取同一個數獲得結果,本題中爲了不重複,遞歸的時候起點+1,能夠保證不取同一個數。htm

這樣作了以後還不夠,本題中隱藏了一個改變,那就是原數組中有重複的數字,全部獲得的結果中依然有重複的。如何解決了?兩個辦法,第一從源頭上解決問題,在循環中,遞歸以前先判斷一下:if (i > start && num[i] == num[i - 1]) continue; 仔細想一下,這樣並不會使最終結果有所缺失,由於每次循環表示:嘗試取當前數,進行遞歸,兩個相同的數不須要嘗試兩次。第二種方法是總結過res使用set類型,最後傳結果時在強制轉換成vector。blog

參考代碼

class Solution {
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        set< vector<int> > res;
        vector<int> answer;
        sort(candidates.begin(), candidates.end());
        solve(candidates, target, res, answer, 0);
        vector < vector<int> > result(res.begin(), res.end());//強制轉換
        return  result;
    }
    
    void solve(vector<int>& candidates, int target, set< vector<int> >& res, vector<int>& answer, int start) {
        if(target < 0) return;
        else if(target == 0) res.insert(answer);
        else {
            for(int i = start; i < candidates.size(); i++) {
                answer.push_back(candidates[i]);
                solve(candidates, target-candidates[i], res, answer, i+1);
                answer.pop_back();
            }
        }
    }
};

類似題目

LeetCode 39. Combination Sum遞歸


LeetCode All in One題解彙總(持續更新中...)ip

本文版權歸做者AlvinZH和博客園全部,歡迎轉載和商用,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利.leetcode

相關文章
相關標籤/搜索