給定乙個整數陣列 nums 和乙個正整數 k,找出是否有可能把這個陣列分成 k 個非空子集,其總和都相等。
示例 1:
輸入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
輸出: true
說明: 有可能將其分成 4 個子集(5),(1,4),(2,3),(2,3)等於總和。
注意:1 <= k <= len(nums) <= 16
0 < nums[i] < 10000
思路:其實就是將每乙個數都遍歷一遍,然後利用回溯的思想,把不滿足的情況又吐出來
class
solution
:def
canpartitionksubsets
(self, nums: list[
int]
, k:
int)
->
bool
:if k==1:
return
true
sumnum=
sum(nums)
if sumnum%k!=0:
return
false
per=sumnum/k
nums.sort(reverse=
true
) n=
len(nums)
if nreturn fasle
visited=
set(
)def
dfs(k,tmp_sum,loc)
:if tmp_sum==per:
return dfs(k-1,
0,0)
if k==1:
return
true
for i in
range
(loc,n)
:if i not
in visited and nums[i]
+tmp_sum<=per:
visited.add(i)
if dfs(k,tmp_sum+nums[i]
,i+1):
#這一行**其實就是滿足相等情況就繼續往下搜
return
true
visited.remove(i)
#不滿足就把i去掉重新搜
return
false
return dfs(k,0,
0)
(DFS)698 劃分為k個相等的子集
給定乙個整數陣列 nums 和乙個正整數 k,找出是否有可能把這個陣列分成 k 個非空子集,其總和都相等。示例 1 輸入 nums 4,3,2,3,5,2,1 k 4 輸出 true 說明 有可能將其分成 4 個子集 5 1,4 2,3 2,3 等於總和。注意 1 k len nums 16 0 n...
力扣698 劃分為k個相等的子集 回溯演算法
給定乙個整數陣列 nums 和乙個正整數 k,找出是否有可能把這個陣列分成 k 個非空子集,其總和都相等。示例 輸入 nums 4,3,2,3,5,2,1 k 4 輸出 true 說明 有可能將其分成 4 個子集 5 1,4 2,3 2,3 等於總和。引用labuladong大佬的回溯演算法思想.回...
LeetCode 698 劃分為k個相等的子集
給定乙個整數陣列 nums 和乙個正整數 k,找出是否有可能把這個陣列分成 k 個非空子集,其總和都相等。回溯 因為每個元素都要用上,那取到和為target的一組值,就設定total為0重新取。遞迴終止條件是,當沒有值可取且target等於total。一旦找到這樣的集合,提前阻斷,一直返回true ...