遞迴的方法其實不難想,但是很難寫。很容易想到,求出子集的和sum,然後找出是否存在正好k個子集的和都等於sum。這裡的比較有技巧的點是,如果需要k個子集,那麼建k個桶groups,每個桶都初始化為sum。接著就進入遞迴,遞迴傳入初始索引pos從0開始,在遞迴內部對groups進行迴圈,當索引pos大於nums範圍時,說明所有groups都已經被填滿了,因為nums的和一定是等於groups的和。
bool
canpartitionksubsets
(vector<
int>
& nums,
int k)
else
sort
(nums.
begin()
,nums.
end(
),greater<
int>()
);vector<
int>
groups
(k,sum)
;return
cansubsets
(nums,
0,groups);}
bool
cansubsets
(vector<
int>
& nums,
int pos,vector<
int>
& groups)
int len=groups.
size()
;for
(int i=
0;igroups[i]
+=nums[pos]
;//pos不該在桶中,拿出}}
return
false
;}
演算法實踐 劃分為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...
LeetCode 698 劃分為k個相等的子集
給定乙個整數陣列 nums 和乙個正整數 k,找出是否有可能把這個陣列分成 k 個非空子集,其總和都相等。回溯 因為每個元素都要用上,那取到和為target的一組值,就設定total為0重新取。遞迴終止條件是,當沒有值可取且target等於total。一旦找到這樣的集合,提前阻斷,一直返回true ...
LeetCode698 劃分為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.計算出每個子集的和,為 sum s...