最后一块石头的重量 II、目标和、一和零

  • 最后一块石头的重量 II
    • 1.方法
      • 图解步骤![在这里插入图片描述](https://img-blog.csdnimg.cn/d2266317bc43491fb261f6372c2e0c9d.jpeg)
      • 代码
  • 目标和
    • 1.方法
      • 图解步骤
      • 代码
  • 一和零
    • 图解步骤
    • 代码

最后一块石头的重量 II

力扣连接:1049. 最后一块石头的重量 II(中等)

1.方法

和 416. 分割等和子集 (opens new window) 非常像了

图解步骤

代码

class Solution {public int lastStoneWeightII(int[] stones) {int sum = Arrays.stream(stones).sum();int target = sum/2;int[] dp = new int[target+1];int n = stones.length;for(int i=0;i<n;i++){for(int j=target; j>=stones[i]; j--){dp[j] = Math.max(dp[j], dp[j-stones[i]]+stones[i]);}}int other = sum-dp[target];//另一堆石头return other-dp[target];}
}


目标和

力扣连接:494. 目标和(中等)

1.方法

  1. 确定dp数组以及下标的含义
    dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法

  2. 确定递推公式
    只要搞到nums[i],凑成dp[j]就有dp[j - nums[i]] 种方法。
    例如:dp[j],j 为5,
    已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。
    已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。
    已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 容量为5的背包
    已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 容量为5的背包
    已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 容量为5的背包
    那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。

图解步骤

关键点

  • if (abs(target) > sum) return 0; // 此时没有方案
  • f ((target + sum) % 2 != 0) return 0; // 此时没有方案

代码

class Solution {public int findTargetSumWays(int[] nums, int target) {int sum = Arrays.stream(nums).sum();//target过大的情况if(target<0 && Math.abs(target)>sum) return 0;//无法整除的情况if((target+sum)%2!=0) return 0;int left = (target+sum)/2;//背包容量为j时,有dp[j]种方法int[] dp = new int[left+1];//初始化dp[0] = 1;for(int i=0;i<nums.length;i++){for(int j=left;j>=nums[i];j--){dp[j] += dp[j-nums[i]];}}return dp[left];}
}


一和零

力扣连接:474. 一和零(中等)

  1. 确定dp数组(dp table)以及下标的含义
    dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。
  2. 确定递推公式
    dp[i][j] 可以由前一个strs里的字符串推导出来,strs里的字符串有zeroNum个0,oneNum个1。
    dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。
    然后我们在遍历的过程中,取dp[i][j]的最大值。
    所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);

图解步骤

代码

class Solution {public int findMaxForm(String[] strs, int m, int n) {int[][] dp = new int[m+1][n+1];for(String str: strs){int zeroNum = 0;int oneNum = 0;for(char ch: str.toCharArray()){if(ch=='1'){oneNum++;}else{zeroNum++;}}for(int i=m;i>=zeroNum;i--){for(int j=n;j>=oneNum;j--){dp[i][j] = Math.max(dp[i][j], dp[i-zeroNum][j-oneNum]+1);}}}return dp[m][n];}
}


【5.31 代随_43day】 最后一块石头的重量 II、目标和、一和零相关推荐

  1. LeetCode-动态规划背包题-1049. 最后一块石头的重量 II

    描述 1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石 ...

  2. 最后一块石头的重量 II

    最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x ...

  3. day36|1049. 最后一块石头的重量 II、494. 目标和、474.一和零

    1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重 ...

  4. leetcode1049. 最后一块石头的重量 II(java)

    最后一块石头的重量 II leetcode1049. 最后一块石头的重量 II 题目描述 解题思路 解法一 暴力递归 解法二 动态规划 动态规划专题 leetcode1049. 最后一块石头的重量 I ...

  5. LeetCode 1049. 最后一块石头的重量 II

    1049. 最后一块石头的重量 II 无论按照何种顺序粉碎石头,最后一块石头的重量总是可以表示成 可以这样理解,将所有的石头分为两堆,ki=1的石头是一堆,ki=-1的石头是另一堆,我们的目标就是求上 ...

  6. LeetCode149、最后一块石头的重量 II

    1049最后一块石头的重量 II 文章目录 1049最后一块石头的重量 II 题目链接 题目描述 解题思路 代码实现 总结 题目链接 https://leetcode-cn.com/problems/ ...

  7. day43|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

    1049. 最后一块石头的重量 II 1.代码 class Solution { public:int lastStoneWeightII(vector<int>& stones) ...

  8. 153、【动态规划】leetcode ——1049. 最后一块石头的重量 II:滚动数组(C++版本)

    题目描述 原题链接:1049. 最后一块石头的重量 II 解题思路 本题要找的是最小重量,我们可以将石头划分成两个集合,当两个集合的重量越接近时,相减后,可达到的装量就会是最小,此时本题的思路其实就类 ...

  9. 【43天|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零 】

    1049. 最后一块石头的重量 II dp[j] 表示j容量的背包可以背下石头的最大重量. class Solution {public:int lastStoneWeightII(vector< ...

最新文章

  1. 常见医疗扫描图像处理步骤
  2. Google CEO Sundar Pichai :“谷歌最大的威胁就是自身的成功”
  3. spotlight监控linux性能
  4. bread是可数还是不可数_雅思官方语法教程之——这个名词到底可不可数?
  5. 国家开放大学2021春1050金融理论前沿课题题目
  6. 构建之法——需求分析+项目经理+典型用户和场景
  7. SQL server中如何使用return,break和continue
  8. @Responsebody与@RequestBody
  9. Windows中cmd命令启动Oracle数据
  10. 程序员常识--OJ系统及ACM测试题库大全
  11. (二十二)【模电】(波形的发生与信号的转换)电压比较器
  12. 清华EMBA课程系列思考之十七(1) -- 新企业的孵化与创业投资
  13. 单片机c语言出租车计时程序,基于单片机的出租车计费(c语言
  14. win10开机的微软服务器,部分 Win10 Edge 浏览器开机自动启动,微软确认是 bug
  15. linux排行榜网站,DistroWatch网站搞的Linux国际排名为它赢得了不少的流量
  16. PS练习3——渐变色
  17. 第一次独立使用无人船记录日志—第1天
  18. 用迭代器指针改变map容器的值
  19. asp.net mvc 5 identity 2.0 注册时密码强度验证
  20. 买了个VR眼镜,体验一下元宇宙

热门文章

  1. 远离敏捷状态的 Scrum 框架
  2. Ubuntu18.04+Ros Melodic安装Moveit
  3. 高斯投影坐标计算例题_高斯投影坐标计算程序
  4. Gprinter Android SDK V2.0 使用说明
  5. 数据压缩作业:png图像格式分析
  6. 使用VirtualBox一步一步安装Ubuntu 22.04
  7. 计算机要通过手机传播,如何将手机与电脑连接起来,从而把手机里的照片和视频传到电脑上?...
  8. 迅雷+小米=现象级区块链应用?
  9. 输出100以内的奇数的和
  10. 使用SQL生成非均匀随机数