zoukankan      html  css  js  c++  java
  • 【leetcode】698. Partition to K Equal Sum Subsets

    题目如下

    解题思路:本题是【leetcode】473. Matchsticks to Square的姊妹篇,唯一的区别是【leetcode】473. Matchsticks to Square指定了分成四个子数组,而本题分成的份数不定,作为参数输入。另外,本题的测试用例好像复杂一点,因此我过滤掉了nums中值等于avg的元素,不参与后面的DFS计算,提高效率。

    代码如下

    class Solution(object):
        def canPartitionKSubsets(self, nums, k):
            """
            :type nums: List[int]
            :type k: int
            :rtype: bool
            """
            border = k
            if sum(nums) % border != 0:
                return False
            avg = sum(nums) / border
            #过滤掉了nums中值等于avg的元素,不参与后面的DFS计算
            newnums = []
            for i in nums:
                if i == avg:
                    border -= 1
                    continue
                newnums.append(i)
            nums = newnums[:]
            nums.sort()
            queue = [[x] for x in xrange(len(nums))]
            res = []
            visit = [0 for x in xrange(len(nums))]
            while len(queue) > 0:
                nl = queue.pop(0)
                amount = 0
                for i in nl:
                    amount += nums[i]
                if amount == avg:
                    res.append(nl)
                    for i in nl:
                        visit[i] = 1
                    continue
                tl = []
                for i in xrange(nl[-1] + 1, len(nums)):
                    if amount + nums[i] <= avg:
                        tl = nl[:]
                        tl.append(i)
                        queue.append(tl)
            if len(res) < border:
                return False
            if sum(visit) != len(visit):
                return False
            queue = []
            for i in res:
                queue.append((set(i), 1))
            # print queue
            while len(queue) > 0:
                ns, count = queue.pop(0)
                if count == border and len(ns) == len(nums):
                    # print ns
                    return True
                for i in res:
                    # print ns | set(i)
                    if len(ns | set(i)) == len(ns) + len(i):
                        queue.insert(0, (ns | set(i), count + 1))
    
            return False
  • 相关阅读:
    物料清单概述
    java开发webservice的1种方式
    java web service简单示例
    IOS证书过期
    Windows 2012 R2 安装net4.6.1
    sqlserver 性能调优脚本
    solidty--owner.sol
    ERC20-USDT
    EOS 公开节点及自有节点部署
    微信第三方平台授权流程
  • 原文地址:https://www.cnblogs.com/seyjs/p/9049495.html
Copyright © 2011-2022 走看看