1. 程式人生 > >leetcode 39組合總數 python

leetcode 39組合總數 python

給定一個無重複元素的陣列 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

說明:

所有數字(包括 target)都是正整數。
解集不能包含重複的組合。
示例 1:

輸入: candidates = [2,3,6,7], target = 7,
所求解集為:
[
[7],
[2,2,3]
]
示例 2:

輸入: candidates = [2,3,5], target = 8,
所求解集為:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
思路:
意思說 給你一組正數C,然後 給你一個目標數T, 讓你從那組C中找到加在一起等於T的那些組合。
比如 給你7 然後 從[2,3,6,7]中可以找到[2,2,3]和[7]兩組組合。
想了一下還是用DFS:

就以這個例子舉,比如讓我找組成7的數,
首先那個7肯定是。
然後再看,6,如果6在我們結果裡,那還得有能組成7-6=1的數,對吧,然而並沒有1,放棄6
再看3,如果要有3,那後面要有能組成7-3=4的數,
發現了什麼沒有。。
只是從需要組成7的變換成需要組成4的,那寫一個函式就可以了。

這個函式的主題邏輯是:
Target =T,然後從陣列中找一個數n,然後在 剩下的部分target 變成了 T-n,以此類推。

函式到哪返回呢,如果目標數T=0,則找的成功,返回,如果目標數T小於C中最小的數,言外之意就是我們找到不這樣的組合了,尋找失敗,返回。
需要注意的是,答案要求沒有重複的,如果只是這麼寫會變成[2,3,2],[2,2,3],[3,2,2],因此要記下 上一個數,我是從小往大找的,也就是說,

如果我已經找完n=2的情況,再去找n=3的時候,3就不應該往回再選n=2了,只能往後走,不然就會重複。

class Solution(object):
    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        self.resList = []
        candidates = sorted(candidates)
        self.dfs(candidates,[],target,0)
        return self.resList
    def dfs(self, candidates, sublist, target, last):
        if target == 0:
            self.resList.append(sublist[:])
        if target< candidates[0]:
            return 
        for n in candidates:
            if n > target:
                return
            if n < last:
                continue
            sublist.append(n)
            self.dfs(candidates,sublist,target - n, n)
            sublist.pop()

在這裡插入圖片描述