golang 組合數總和

2021-10-09 07:45:03 字數 3339 閱讀 8704

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

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

說明: 示例

輸入:candidates =[2

,3,6

,7], target =7,

所求解集為:[[

7],[

2,2,3]]

回溯演算法實際上乙個類似列舉的深度優先搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,

當發現已不滿足求解條件時,就「回溯」返回(也就是遞迴返回),嘗試別的路徑。

必須要有乙個臨時變數引數,傳遞不完整解

通常用全域性變數,儲存完整解

在引數設計中,可以得到結束條件

去重

import "sort"

func combinationsum

(candidates [

]int, target int)

int

var backtrack func

(int,int,

int)

backtrack =

func

(begin,target int,path [

]int)

if target==

0for i:

=begin;i<

len(candidates)

;i++

path =

(path,candidates[i]

)backtrack

(i,target-candidates[i]

,path)

path = path[

:len

(path)-1

]}}backtrack(0

,target,

int)return rs

}

py列表加法操作返回的是乙個全新的副本列表py基本型別傳參時,是值複製

class

solution

:def

combinationsum

(self, candidates: list[

int]

, target:

int)

-> list[list[

int]]:

defdfs

(candidates, begin, path, rs, target)

:if target ==0:

return

for index in

range

(begin,

len(candidates)):

residue = target - candidates[index]

if residue <0:

break

dfs(candidates, index, path +

[candidates[index]

], rs, residue)

iflen

(candidates)==0

:return

candidates.sort(

) path =

rs =

dfs(candidates,

0, path, rs, target)

return rs

保證回溯狀態一致,入參的臨時不完全解變數與外層函式保持一致,即要求回溯後的不完全解狀態與遞迴前外層不完解狀態一樣或相同

class

solution

function

backtrace

($idx

,$path

,$target)if

($target==0

)for($i

=$idx;$i

<

count

($this

->

candidates);

$i++

)$path

=array_merge

($path,[

$this

->

candidates[$i

]]);

$this

->

backtrace($i

,$path

,$target

-$this

->

candidates[$i

]);array_pop

($path);}}}

找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 - 9 的正整數,並且每種組合中不存在重複的數字。

輸入: k =

3, n =

9輸出:[[

1,2,

6],[

1,3,

5],[

2,3,4]]

func

combinationsum3

(k int

, n int)[

]int

var backtrace func

(int

,int,[

]int

) backtrace =

func

(idx int

, target int

, path [

]int)if

len(path)

>= k

return

}for i:=idx;i<

9;i++

iflen

(path)

>

0&& path[

len(path)-1

]==i+

1 path =

(path, i+1)

backtrace

(i,target-i-

1,path)

path = path[

:len

(path)-1

]}}backtrace(0

,n,[

]int

)return rs

}

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...

組合總和II

給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。示例 1 輸入 candid...

組合總和 II

給定乙個陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的每個數字在每個組合中只能使用一次。說明 所有數字 包括目標數 都是正整數。解集不能包含重複的組合。示例 1 輸入 candidates 1...