子集 組合問題

2021-10-25 15:34:53 字數 2449 閱讀 8758

leetcode78-組合問題

leetcode39-子集問題

lc78子集問題

迭代法**如下:

"""

迭代方法:利用歸納思想,舉例如下,{}用於提示讀者注意迭代部分所在

nums=[1,2,3]

, # 注意[1] 是 + [1] 得到

, [1], # 注意[2],[1,2] 是 + [2] 和 [1] + [2]得到

, [1], [2], [1,2],

"""def

subsets

(self, nums: list[

int])-

> list[list[

int]]:

res =[[

]]for num in nums:

res +=

[r +

[num]

for r in res]

return res

值得一提的是,回溯體現在上述遞迴中還有遍歷存在,如[0]遞迴得到[0,1],然後又遞迴得到[0,2],可視為[0,1]去掉[1]得到[0](故稱為回溯)後新增[2]才得到的[0,2]

遞迴法**如下

def

subsets

(self, nums: list[

int])-

> list[list[

int]]:

""" 回溯/遞迴方法:不斷增加index及res_list

nums=[1,2,3,4]

[1]...

[1,2],[1,3],[1,4]...

[1,2,3],[1,2,4]...

"""res =

ifnot nums:

return res

n =len(nums)

# 建立遞迴函式,是遞迴方法典型的寫法

defhelper

(i, tmp)

:for j in

range

(i, n)

: helper(j+

1, r +

[nums[j]

)

helper(0,

)return res

lc39組合問題

遞迴**如下:

class

solution

:def

combinationsum

(self, candidates: list[

int]

, target:

int)

-> list[list[

int]]:

""" 迭代/遞迴方法

c = [2,3,5] t = 8

3種情況:來自[2,3,5];來自[3,5];來自[5]

以[2,3,5]舉例

[2]&t=6 # 取2,新的target=6

[2,2]&t=4, [2,3]&t=3, [2,5]&t=1

[2,2,2]&t=2, [2,2,3]&t=1, [2,2,5x]...

[2,2,2,2], [2,2,3,2x]...

"""ifnot candidates:

# or none

return

res =

len_c =

len(candidates)

candidates.sort(

)# 構造遞迴函式

defhelper

(i, target)

:# 遞迴終止條件

if candidates[i]

> target:

# 2 > 1,沒有後續選擇

return

elif candidates[i]

== target:

# 乙個選擇

return

[[candidates[i]]]

c = candidates[i]

res_list =

# 逐漸增加以便控制重複

for j in

range

(i, len_c)

:if candidates[j]

<= target - c:

sub_res_list = helper(j, target-c)

for sr in sub_res_list:

# 將返回的子結果累積

[c]+ sr)

else

:break

return res_list

for i in

range

(len_c)

: res.extend(helper(i, target)

)return res

組合 子集問題彙總

子集的問題的思路也分兩個方向,一種是解空間樹是關於每個數選還是不選,結點取值範圍就是true or false。解向量的長度是固定的,即candidates的個數,而且只有完全解才是問題的解。解向量不是直接的答案,而是標誌每個candidates選還是不選。答案需要另乙個向量根據搜尋的路徑填充。第二...

子集合問題,排列出所有子集組合

想了好幾天,網上也沒有給出具體方法,索性就自己寫了乙個,但是效率不是很高,可以根據需求進行優化 public static void subset int arr,int target,list alllist else 遞迴結果集 public static void recursion int ...

演算法 全排列問題,組合問題,子集問題

演算法 全排列問題,組合問題,子集問題 子集問題 public class solution void rec int s,int s,int e,listlist,list res else void rec1 int s,int s,int e,listlist,list res for int...