首先是題意:做每道演算法題,最重要的是,讀懂題意,從分析我們可以得出來的是,目標值及每個子集的和target=sum(nums)/k,所以就確定了目標值target。
得出目標值後,我們可以得到一些一定為false的情況,如
目標值不為整數
nums中有值大於target的
我們還可以先找出nums中是否有等於target的值,
這道題的思路就是把nums所有元素都放進長度為k的groups陣列當中,如果剛剛放完,則返回true。
對於放進groups這個動作我們稱它為搜尋元素放進group,對於一共k個子集的我們只需要乙個for迴圈就能解決。
使用遞迴我們可以做到一直搜尋。只用改變當前搜尋的值,就能一直向group陣列中新增。
如果看不懂思路,請結合**分析。
public
class 劃分為k個相等的子集
; system.out.
println
(a.canpartitionksubsets
(nums,4)
);}public
boolean
canpartitionksubsets
(int
nums,
int k)
return
search
(new
int[k]
, row, nums, target);}
//函式作用:搜尋nums中的每乙個數,能不能新增到groups裡,並且和等於target,row代表當前新增到groups中的數
public
boolean
search
(int
groups,
int row,
int[
] nums,
int target)
//如果遍歷完了,所有數都不能放進groups中,及沒有值相加或者本身等於target,則跳出迴圈break,或者return false;
if(groups[i]==0
)return
false;}
return
false;}
}
力扣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大佬的回溯演算法思想.回...
698 劃分為k個相等的子集 python
給定乙個整數陣列 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...
演算法實踐 劃分為k個相等的子集 遞迴)
給定乙個整數陣列nums和乙個正整數k,找出是否有可能把這個陣列分成k個非空子集,其總和都相等。輸入 nums 4,3,2,3,5,2,1 k 4 輸出 true 說明 有可能將其分成 4 個子集 5 1,4 2,3 2,3 等於總和。首先,我們知道k個子集的每乙個和必須等於target sum n...