給定乙個整數陣列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...