LeetCode—416.分割等和子集(Partition Equal Subset Sum)——分析及代码(Java)

LeetCode—416.分割等和子集[Partition Equal Subset Sum]——分析及代码[Java]

一、题目

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

注意:

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

示例 1:

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

示例 2:

输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-equal-subset-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 动态规划

(1)思路

数组可分割为两个元素和相等的子集,等价于数组中存在一些元素,其和为数组元素总和的一半。因此,本题可转换为背包问题,用动态规划方法进行求解。

(2)代码

class Solution {
    
    
    public boolean canPartition(int[] nums) {
    
    
        if (nums.length == 0)
            return false;
        
        int sum = 0;
        for (int i = 0; i < nums.length; i++)
            sum += nums[i];
        if ((sum & 1) == 1)
            return false;
        sum >>= 1;
        
        boolean[] hasSum = new boolean[sum + 1];
        hasSum[0] = true;
        for (int i = 1; i < sum + 1; i++)
            hasSum[i] = false;
        for (int i = 0; i < nums.length; i++) {
    
    
            for (int j = sum; j >= 0; j--) {
    
    
                if (j + nums[i] < sum + 1 && hasSum[j] == true) {
    
    
                    if (j + nums[i] == sum)
                        return true;
                    hasSum[j + nums[i]] = true;
                }
            }
        }

        return hasSum[sum];
    }
}

(3)结果

执行用时 :11 ms, 在所有 Java 提交中击败了 91.54% 的用户;
内存消耗 :38 MB, 在所有 Java 提交中击败了 78.48% 的用户。

三、其他

暂无。

扫描二维码关注公众号,回复: 12247354 查看本文章

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/103431360