[46] 全排列
關鍵點:使用used記錄已使用的用數字
class
solution
:def
permute
(self, nums: list[
int])-
> list[list[
int]]:
self.res =
self.used =
[false]*
len(nums)
self.generatearrange(nums,0,
)return self.res
defgeneratearrange
(self, nums: set[
str]
, count, path: list[
str]):
if count ==
len(nums)::
])return
for i in
range
(len
(nums)):
ifnot self.used[i]:)
self.used[i]
=true
self.generatearrange(nums, count+
1, path)
path.pop(
) self.used[i]
=false
return
[77] 組合
關鍵點1:start記錄當前,開始的點
關鍵點2:遞迴時,start+1跳過當前點
class
solution
:def
combine
(self, n:
int, k:
int)
-> list[list[
int]]:
self.res =
self.generatecombine(n, k,1,
)return self.res
defgeneratecombine
(self, n, k, start, p):if
len(p)
== k::]
)return
# 還有k - p.size()個空位, 所以[i...n]中至少要有k-p.size()個元素
# i最多為n-(k-len(p))+1
max_i = n-
(k-len
(p))+1
for i in
range
(start, max_i +1)
: self.generatecombine(n, k, i+
1, p)
p.pop(
)return
[40] 組合總和 ii
關鍵點1:使用counter記錄所有數字出現的次數,並且通過次數判斷當前數字是否使用完。
關鍵點2:start從自身開始,包括自身,此關鍵點主要針對:找出所有相加之和為 n 的 k 個數的組合這類問題
class
solution
:def
combinationsum2
(self, candidates: list[
int]
, target:
int)
-> list[list[
int]]:
self.res =
self.counter = counter(candidates)
self.keys =
sorted
(self.counter.keys())
self.generatecombination(candidates, target,0,
)return self.res
defgeneratecombination
(self, candidates, target, start, p)
:if target ==0:
:])return
for i in
range
(start,
len(self.keys)):
key = self.keys[i]
if self.counter[key]
>
0and target >= key:
self.counter[key]-=1
self.generatecombination(candidates, target-key, i, p)
self.counter[key]+=1
p.pop(
)return
排列組合總結
在此介紹二進位制轉化法,即,將每乙個組合與乙個二進位制數相應起來,列舉二進位制的同一時候,列舉每乙個組合。如字串 abcde,則有 00000 null 00001 a 00010 b 00011 ab 00100 c 11111 abcde 給出程式例如以下所看到的 include include...
排列組合總結
在此介紹二進位制轉化法,即。將每乙個組合與乙個二進位制數相應起來,列舉二進位制的同一時候,列舉每乙個組合。如字串 abcde,則有 00000 null 00001 a 00010 b 00011 ab 00100 c 11111 abcde 給出程式例如以下所看到的 include include...
演算法 排列組合
a m,n n n m 從 n 個數中取 m 個有前後順序的數列 有 a m,n 種方式 c m,n n n m m a m,n m 從 n 個數中取 m 個無前後順序的數列 有 c m,n 種方式 性質 c m,n c n m,n c r,n 1 c r 1,n c r,n 楊輝三角性質 c 0,...