LeetCode-416. 分割等和子集

416. 分割等和子集


给定一个只包含正整数非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

注意:

  1. 每个数组中的元素不会超过 100
  2. 数组的大小不会超过 200

示例 1:

输入: [1, 5, 11, 5]

输出: true

解释: 数组可以分割成 [1, 5, 5] 和 [11].

 

示例 2:

输入: [1, 2, 3, 5]

输出: false

解释: 数组不能分割成两个元素和相等的子集.

解题思路:这道题好难啊我觉得,看了别人的答案,使用深度优先搜索求解。先对nums数组进行排序,然后使用target数组存储我们需要的目标值。遍历已排序的nums,若nums[i] <= 目标值,则更新目标值,判断目标值是否为0,若为0,直接返回True,否则递归判断下一个nums元素。若遍历结束,说明此情况不满足题意,返回False。

这道题其实和回溯法很像,区别在于找到一个解直接返回,不需要找到所有的解。状态空间如下图:

Python3代码如下:

class Solution(object):
    def canPartition(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        sum_nums = sum(nums)
        div,mod = divmod(sum_nums,2)
        if mod:
            return False
        target = [div]*2
        nums.sort(reverse=True)
        return self.dfs(nums,target,0)
    def dfs(self,nums,target,index):
        for i in range(2):
            if nums[index] <= target[i]:
                target[i] -= nums[index]
                if target[i] == 0 or self.dfs(nums,target,index+1):
                    return True
                target[i] += nums[index]
        return False

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值