题目来源
https://leetcode.com/problems/partition-to-k-equal-sum-subsets/description/
题目描述
Given an array of integers nums and a positive integer k, find whether it’s possible to divide this array into k non-empty subsets whose sums are all equal.
Example 1:
Input: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
Output: True
Explanation: It’s possible to divide it into 4 subsets (5), (1, 4), (2,3), (2,3) with equal sums.
Note:1 <= k <= len(nums) <= 16.
0 < nums[i] < 10000.
Leetcode一贯的题风: 情景简单题目坑. 这题的题意依旧简洁: 给出一个数组和一个数字k, 若能够把数组分成k个子数组使得各个子数组之和相等, 则返回True, 否则返回False.
解题思路
首先有一点是很显然的;: 如果数组元素之和不能被k整除, 那么必定无解.
剩下的问题其实也就是一个比较简单的递归深搜.
设数组之和为total, 那么每个子数组之和就必须要等于total/k,
依照这一原则. 我们依次visit数组的每个元素, 并标记为visited, 当若干个被遍历的元素之和恰好达到total/k, 则重新开启计数.
实现代码
class Solution:
def __init__(self):
nums = []
size = 0
def canPartitionKSubsets(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
self.size = len(nums)
total = sum(nums)
if k <= 0 or total % k:
return False
visited = [0 for i in range(self.size)]
self.nums = nums
return self.recur(int(total / k),0,0,visited,k)
def recur(self, target,cur_total,start,visited,k):
if k == 0:
return True
if cur_total == target:
return self.recur(target,0,0,visited,k-1)
elif cur_total > target:
return False
for i in range(start, self.size):
if not visited[i]:
visited[i] = 1
if self.recur(target,cur_total+self.nums[i],i+1,visited,k):
return True
visited[i] = 0
return False