当前位置: 首页 > news >正文

【leetcode hot 100 416】分割等和子集

解法一:(动态规划)①定义:dp[i]表示是否可以在nums找到元素之和为i,dp[sum/2+1] ②初始状态:dp[0]=true;dp[i]=false ③状态转移方程:dp[i] = dp[i] || dp[i - num];

class Solution {
    public boolean canPartition(int[] nums) {
        // 定义:dp[i]表示是否可以在nums找到元素之和为i,dp[sum/2+1]
        // 初始状态:dp[0]=true;dp[i]=false
        // 状态转移方程:dp[i] = dp[i] || dp[i - num];
        int n = nums.length;

        // 先计算总和
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        // 计算每个子集的和应该为多少
        int target = sum / 2;

        // 预先判断
        // 如果和不能被2整除,则不能分为两个子集
        if (sum % 2 != 0) {
            return false;
        }
        // 由于nums只包含正整数,若任意一个数大于target则不能满足
        for (int num : nums) {
            if (num > target){
                return false;
            }
        }

        // 动态规划
        boolean[] dp = new boolean[target+1]; // dp[i]=true表示能在数组nums中找到子集和为i
        dp[0] = true;
        for (int num : nums) {
            
            // 不需要,后面for循环:
            // 当i=num时,dp[num]=dp[num]||dp[num-num]=dp[num]||dp[0]=false||true=true
            // 而且会错误
            // 没有避免一个数被多次取和没有取!!!!
            // dp[num] = true;  // 给每个dp[num]赋值,num一定存在

            // 循环num,尝试把num加进去,确保每个dp[i]只会用到一个num
            // 第二层的循环我们需要从大到小计算,因为如果我们从小到大更新 dp 值,那么在计算 dp[j] 值的时候,dp[j−nums[i]] 已经是被更新过的状态,不再是上一行的 dp 值。
            for (int i=target; i >= num; i--) {
                dp[i] = dp[i] || dp[i - num];
            }
            if(dp[target]){
                // 已经有子集了,提前结束
                return true;
            }
        }
        return dp[target];
    }
}

注意:

  • 循环num,尝试把num加进去,确保每个dp[i]只会用到一个num
  • 第二层的循环我们需要从大到小计算,因为如果我们从小到大更新 dp 值,那么在计算 dp[j] 值的时候,dp[j−nums[i]] 已经是被更新过的状态,不再是上一行的 dp 值。
  • num一定存在,不需要dp[num] = true; 给每个dp[num]赋值。后面for循环:当i=num时,dp[num]=dp[num]||dp[num-num]=dp[num]||dp[0]=false||true=true;而且会错误,没有避免一个数被多次取和没有取!!!!错误:
    在这里插入图片描述

文章转载自:

http://ld4L20N2.nqmwk.cn
http://M7IuhjVR.nqmwk.cn
http://UAMMgpmZ.nqmwk.cn
http://4qUaqQwB.nqmwk.cn
http://H5Zk8PBg.nqmwk.cn
http://wFn3g0iE.nqmwk.cn
http://cLYAbsBo.nqmwk.cn
http://SqApCZmR.nqmwk.cn
http://FMUDaT2E.nqmwk.cn
http://Yvl9z73D.nqmwk.cn
http://7j24qs28.nqmwk.cn
http://YIZZf1qH.nqmwk.cn
http://epvMrChp.nqmwk.cn
http://l0sNxDCF.nqmwk.cn
http://MujfJTFW.nqmwk.cn
http://Z1r0EfDa.nqmwk.cn
http://VKqlPVeR.nqmwk.cn
http://AGAV1b6r.nqmwk.cn
http://SMheGJPD.nqmwk.cn
http://PO4TIGc3.nqmwk.cn
http://aJuVm491.nqmwk.cn
http://PXNvPlUL.nqmwk.cn
http://HfRtQi2V.nqmwk.cn
http://MN0FxgVy.nqmwk.cn
http://WmU07DZr.nqmwk.cn
http://GR4BSdil.nqmwk.cn
http://btyepqBI.nqmwk.cn
http://ez1V8ka3.nqmwk.cn
http://KJtZUjFZ.nqmwk.cn
http://wNOICVY1.nqmwk.cn
http://www.dtcms.com/a/127928.html

相关文章:

  • MCU刷写——Hex文件格式详解及Python代码
  • AI识别与雾炮联动:工地尘雾治理新途径
  • Win32++ 使用初探
  • 程序化广告行业(79/89):技术革新与行业发展脉络梳理
  • 公开赛Web-ssrfme
  • 【异常处理】Clion IDE中cmake时头文件找不到 头文件飘红
  • 解决2080Ti使用节点ComfyUI-PuLID-Flux-Enhanced中遇到的问题
  • lvs+keepalived+dns高可用
  • 使用nuxt3+tailwindcss4+@nuxt/content3在页面渲染 markdown 文档
  • 红宝书第四十讲:React 核心概念:组件化 虚拟 DOM 简单教程
  • forms+windows添加激活水印
  • 塔能科技解节能密码,工厂成本“效益方程式”精准破题
  • AF3 ProteinDataset类的_process方法解读
  • 操作系统之进程同步
  • python的flask框架连接数据库
  • 区块链从专家到小白
  • GAS:车载体验的智能革新力量
  • Rag实现流程
  • 软件界面设计:打造用户喜爱的交互体验
  • 新版雷电模拟器过应用检测技术详解
  • leetcode 264. Ugly Number II
  • ReactNative 使用腾讯的MMKV持久化存储
  • 深入浅出:信号灯与系统V信号灯的实现与应用
  • 区块链点燃游戏行业新未来——技术变革与实践指南
  • 【Linux网络与网络编程】08.传输层协议 UDP
  • 互联网三高-数据库高并发之分库分表
  • PostgreSQL 的统计信息
  • 0x02.Redis 集群的实现原理是什么?
  • 80_Pandas如何使用NumPy的函数等(pd.np)
  • 【图像生成之21】融合了Transformer与Diffusion,Meta新作Transfusion实现图像与语言大一统