LeetCode698 劃分為k個相等的子集

2021-10-09 18:51:32 字數 1499 閱讀 9670

給定乙個整數陣列 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 = sum(nums) / k

2.將nums公升序排序,如果最大值大於每個子集的和,返回false

3.定義大小為k的陣列arr,相當於k個桶,每個桶的初始值為sum

4.從nums最後乙個數開始遞迴,遞迴函式將每乙個數加入到合適的桶裡面去

什麼時候這個數加入這個桶呢? 當arr[i] == nums[i] || (cur >0 && arr[i] - nums[cur] >= nums[0])

即這個桶正好能放這個數,或者這個桶放完這個數之後至少還能放最小的數

放完之後桶的容量要減少,然後遞迴放下乙個數,如果這個數不能放在這個桶裡面,要從桶裡拿出這個數

#include

#include

#include

#include

using

namespace std;

class

solution

if(sum % k !=0)

sum/

=k;//每個子集之和

sort

(nums.

begin()

,nums.

end())

;if(nums[nums.

size()

-1]> sum)

vector<

int>

arr(k,sum)

;//k個容量為sum的桶

return

foreverynum

(nums,nums.

size()

-1,arr,k);}

bool

foreverynum

(vector<

int>

&nums,

int cur,vector<

int>

&arr,

int k)

//對每個數,遍歷k個桶,選擇乙個放入

for(

int i =

0; i < k; i++

)//這個數不能放在這個桶裡面,從桶中拿回這個數

arr[i]

+= nums[cur];}

}return

false;}

};intmain()

cin>>k;

solution s;

int res = s.

canpartitionksubsets

(nums,k);if

(res ==1)

else

return0;

}

LeetCode 698 劃分為k個相等的子集

給定乙個整數陣列 nums 和乙個正整數 k,找出是否有可能把這個陣列分成 k 個非空子集,其總和都相等。回溯 因為每個元素都要用上,那取到和為target的一組值,就設定total為0重新取。遞迴終止條件是,當沒有值可取且target等於total。一旦找到這樣的集合,提前阻斷,一直返回true ...

leetcode 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 nums...

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...