您好,登錄后才能下訂單哦!
本篇內容主要講解“Python組合總和怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“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] ]
提示:
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每個元素都是獨一無二的。
1 <= target <= 500
先審題,題目給定無重復元素數組和目標值 target,要求找出數組中所有可以使數組元素和為 target 的組合。
其中數組中的元素都為正整數,可以重復使用數組中的元素,但是解集中不能存在重復的組合。
這里可以看示例 1:
輸入:candidates = [2,3,6,7], target = 7, 所求解集為: [ [7], [2,2,3] ]
這里答案并沒有 [2,3,2] 或 [3,2,2],因為這兩者就被視為與 [2,2,3] 為重復的組合,這里需要特別注意。
在這里 $\color{red}{?}$ 表示不選擇此元素,這樣就可以避免元素組合重復的情況,$\color{green}{?}$ 表示當前路徑選擇元素和大于目標值 target,而 $\color{green}{?}$ 則表示當前路徑選擇元素和等于目標值,可以將此組合添加到返回列表中。
在上面的圖例中,只是簡單畫出了一個分支的情況,但是其他分支選擇的策略相同,這里就省略了。若有不太明白的地方,建議可以自行在草稿上進行補全,也幫助自己理解。
那么就按照上面圖例中的思路,用代碼進行實現,具體如下。
class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: # 結果列表 ans = [] # 可能的組合 tmp = [] def helper(idx, total): """回溯,求組合總和 Args: idx: 選取元素索引 total: 組合中的元素和 """ # 基準條件 # 當元素和大于目標值,直接返回 if total > target: return # 當元素和等于目標值,將組合添加到結果中,返回 if total == target: ans.append(tmp[::]) return # 進入分支,同時避免重復組合 for i in range(idx, len(candidates)): # 更新 total 值, total += candidates[i] # 同時將當前元素嘗試添加到組合中 tmp.append(candidates[i]) # 再次進入遞歸 # 這里可以看文章圖例,遞歸向下,可選元素是從自身開始選擇 # 這里同時也能避免組合重復,因為不會再次選擇索引 i 前面對應的元素 helper(i, total) # 回溯,回退組合元素及 total 值 tmp.pop() total -= candidates[i] total = 0 helper(0, total) return ans
到此,相信大家對“Python組合總和怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。