回溯 LeetCode77 組合(Python)

2021-10-24 11:16:18 字數 1787 閱讀 4512

給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。

輸入: n = 4, k = 2

輸出:[

[2,4],

[3,4],

[2,3],

[1,2],

[1,3],

[1,4],

]

回溯回溯-39. 組合總和 

77.組合

40. 組合總和 ii

78. 子集

90. 子集 ii

solution/hui-su-suan-fa-by-powcai-4/

class solution(object):

def combine(self, n, k):

""":type n: int

:type k: int

:rtype: list[list[int]]

"""res =

def backtrack(i, k, tmp): # k個數(減至0)

if k == 0:

return

for j in range(i, n + 1): # n表示從1到n中取k個數的組合

backtrack(j+1, k-1, tmp + [j])

backtrack(1, k, )

return res

solution/hui-su-suan-fa-by-powcai-4/

題目就是要求我們從1到n找長度為k的組合數,所以回溯的終止條件就有了。

然後就是回溯的模板,但更重要的是弄清漸枝的條件,相同元素但順序不同仍舊算為一組,那麼也就是不能出現逆序。

class solution:

def combine(self, n: int, k: int) -> list[list[int]]:

def back(candidates, cur):

if len(cur) == k:

return

for i in range(len(candidates)):

if len(cur) > 0 and candidates[i] < cur[-1]: # 最重要是這一句實現剪枝,如果出現逆序就continue

continue

back(candidates[:i] + candidates[i + 1:], cur)

cur.pop()

nums = [i for i in range(1, n + 1)]

result =

back(nums, )

return result

solution/xiong-mao-shua-ti-python3-hui-su-jian-zhi-by-lot-2/

def zuhe(m, n):

x = 1

y = 1

ret = 1

if m < n:

return

else:

c = min(n, m-n)

for i in range(c):

x = x*(m-i)

y = y * (c-i)

ret = x//y

return ret

m = int(input())

n = int(input())

ans = zuhe(m, n)

print(ans)

leetcode 77 組合 回溯加剪枝

給定兩個整數 n 和 k,返回 1 n 中所有可能的 k 個數的組合。示例 輸入 n 4,k 2 輸出 2,4 3,4 2,3 1,2 1,3 1,4 分析 此題為較簡單,使用回溯加剪枝即可解決。首先我們分析遞迴函式的引數,需要乙個pos來表示當前選取了多少個數,同時還需要乙個引數curr來表示當前...

每日一題 leetcode 77 組合

組合 難度中等256 給定兩個整數 n 和 k,返回 1 n 中所有可能的 k 個數的組合。示例 輸入 n 4,k 2 輸出 2,4 3,4 2,3 1,2 1,3 1,4 回溯法是一種選優搜尋法,按選優條件向前搜尋,已達到目標,但當搜尋到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇...

leetcode 77 組合 題解

給定兩個整數 n 和 k,返回 1 n 中所有可能的 k 個數的組合。其它方法 combinations和permutations返回的是物件位址,需要將iterator 轉換成list 即可 題解1 執行用時 48 ms,在所有 python3 提交中擊敗了95.61 的使用者 記憶體消耗 14....