給定乙個無重複元素的陣列 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...