演算法實踐 劃分為k個相等的子集 遞迴)

2021-10-03 20:37:34 字數 2765 閱讀 5619

給定乙個整數陣列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(nums) / k(如果target不是整數,那麼是不符合題目要求的)。

我們可以對陣列 num 進行排序,以便我們嘗試先放置較大的元素。這種放置元素的方法將更快組合出較小大小的子集。我們還可以適當處理 nums[i] >= target 的情況。這些技巧不是解決問題所必需的,但它們在下面的解決方案中給出。

使用visited陣列,將nums中的數字由大到小一次試探,將其新增到visited中,如果成功的達到了目標值,就減小問題規模,轉化為劃分為k-1個非空子集。

nums =[10

,10,10

,7,7

,7,7

,7,7

,6,6

,6]k =

3class

solution

:def

canpartitionksubsets

(self, nums, k)

->

bool

:if k==1:

return

true

target,rem =

divmod

(sum

(nums)

, k)

if rem:

return

false

nums.sort(reverse=

true

) n=

len(nums)

if nreturn fasle

visited=

set(

)def

dfs(k,tmp_sum,loc)

:if tmp_sum==target:

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<=target:

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)a = solution(

)print

(a.canpartitionksubsets(nums,k)

)

想通過減小nums陣列的規模來解決問題,遍歷nums,將每個元素依次新增到num[1…length]中,遞迴出口nums.length 等於k時判斷是否相等,這樣大大增加了時間複雜度。

nums =[4

,3,2

,3,5

,2,1

]k =

4#判斷是否相等

defisequal

(nums)

: b=

len(

set(nums)

)#去重

#重複if

(b>1)

:return

false

#不重複,都相等

return

true

length =

len(nums)

issuccess =

false

defkdivide

(nums)

:#如果是小數,則不可能

target, rem =

divmod

(sum

(nums)

, k)

if rem:

return

iflen

(nums)

==k:

if(isequal(nums)):

issuccess =

true

return

return

else

:for j in

range

(len

(nums)):

# if(temp[j]<=target):

for i in

range

(len

(nums)):

if(i!=j)

: temp = nums[:]

temp[i]

+= temp[j]

# if(temp[i]<=target):

temp.pop(j)

kdivide(temp)

kdivide(nums)

print

(issuccess)

力扣 劃分為k個相等的子集

首先是題意 做每道演算法題,最重要的是,讀懂題意,從分析我們可以得出來的是,目標值及每個子集的和target sum nums k,所以就確定了目標值target。得出目標值後,我們可以得到一些一定為false的情況,如 目標值不為整數 nums中有值大於target的 我們還可以先找出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...

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