題目:
給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
candidates 中的數字可以無限制重複被選取。
說明:所有數字(包括 target)都是正整數。
解集不能包含重複的組合。
示例 1:
輸入: candidates = [2,3,6,7], target = 7,
所求解集為:
[[7],
[2,2,3]
]示例 2:
輸入: candidates = [2,3,5], target = 8,
所求解集為:
[[2,2,2,2],
[2,3,3],
[3,5]
]思路:
利用回溯法。
遍歷陣列每個數,尋找每個數與自身或者和其他數相加等於目標值的組合。
如題目:
輸入: candidates = [2,3,6,7], target = 7,
首先back(0,0,)(起始遍歷位置,陣列相加值,遍歷過程儲存陣列)
i=0,sum=0,tmp=
i=0,sum=2,tmp=2
因為candidates 中的數字可以無限制重複被選取。
i=0,sum=6,tmp=[2,2,2].再加陣列任何乙個元素超過,這個陣列組合扔掉。
i=0,sum=4,tmp=[2,2],加下乙個3,剛剛好,陣列留下。
i=0,sum=4,tmp=[2,2],除了3,加陣列任何其他元素都超過,[2,2]組合已完成。
i=0,sum=2,tmp=[2],加3,3超過,加陣列其他任何乙個也超過。[2]組合已完成。
i=1,sum=3,tmp=[3]
i=1,sum=6,tmp=[3,3],加3超過,加陣列其他也超過。[3,3]組合已完成。
i=1,sum=3,tmp=[3],加3後的數字都超過目標值。[3]已完成。
i=2,sum=6,tmp=[6],同理。
i=3,sum=7,tmp=[7].加入答案。
陣列遍歷完成。答案是[2,2,3]和[7]
**:
def combinationsum(self, candidates: list[int], target: int) -> list[list[int]]:
candidates.sort()
leng=len(candidates)
ans=
def backfunc(i,sum,tmp):
if sum>target or i==leng:
return
if sum==target:
return
for j in range(i,leng):
if sum+candidates[j]>target:
break
backfunc(j,sum+candidates[j],tmp+[candidates[j]])
backfunc(0,0,)
return ans
39 組合總和
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2...
39 組合總和
給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 示例 2 ...
39 組合總和
給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。說明 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 輸入 candida...