Partition to K Equal Sum Subsets Leetcode #698 题解[Python]

这是一篇关于LeetCode第698题《Partition to K Equal Sum Subsets》的解题报告。题目要求使用Python编程语言判断给定数组是否能被分割成k个和相等的非空子集。文章讨论了题目的来源、描述、解题思路,并提供了详细的实现代码。关键在于检查数组元素总和能否被k整除,然后使用递归深搜策略进行分割。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源


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

ac_698

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值