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

代码随想录算法训练营第四十四天| LeetCode322. 零钱兑换、LeetCode279.完全平方数、LeetCode139.单词拆分

#LeetCode322. Coin Change

#LeetCode322. 视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换_哔哩哔哩_bilibili

动态规划五部曲:

1. dp 数组的含义:组成数量为j 的背包,共有dp[j] 件物品

2. 递推公式:dp[j] = Math.min(dp[j - nums[i]] + 1, dp[j])

3. dp 数组初始化:dp[0] = 0,代表组成数量为0 的背包,有0 个物品,很好理解,但其他非零下标需要考虑在Math.min 中有意义,所以所有的非零下标的数组赋值为Integer.Max_VALUE

4. 遍历顺序:最后所求的是最小的元素数目,其实两层for 循环的遍历顺序并不影响,所以先遍历背包或者先遍历物品都可以

5. 打印dp 数组:方便检查

代码:

class Solution {public int coinChange(int[] coins, int amount) {int max = Integer.MAX_VALUE;int[] dp = new int[amount + 1];for (int i = 0; i < dp.length; i++) {dp[i] = max;}dp[0] = 0;for (int i = 0; i < coins.length; i++) {for (int j = coins[i]; j <= amount; j++) {if (dp[j - coins[i]] != max) {dp[j] = Math.min(dp[j - coins[i]] + 1, dp[j]);}}}return dp[amount] == max ? -1: dp[amount];}
}

#LeetCode279. Perfect Squares

#LeetCode279. 视频讲解:动态规划之完全背包,换汤不换药!| LeetCode:279.完全平方数_哔哩哔哩_bilibili

这个题目也是背包问题,背包的容量是输入的n ,而物品是完全平方数,只是这个物品需要自己来“创建或者表示”。

动态规划五部曲:

1. 确定dp 数组的含义:和为j 的完全平方数需要的元素个数为dp[j] 个

2. 递推公式:dp[j] = Math.min(dp[j - i * i], dp[j])

3. dp 数组初始化:dp[0] = 0,代表和为0 的完全平方数的最小数量,其他非零下标需要考虑在Math.min 中有意义,所以所有的非零下标的数组赋值为Integer.Max_VALUE

4. 确定遍历顺序:最后所求的是最小的元素数目,其实两层for 循环的遍历顺序并不影响,所以先遍历背包或者先遍历物品都可以

5. 打印dp 数组:方便检查

代码:

class Solution {public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];for (int i = 0; i < n + 1; i++) {dp[i] = max;}dp[0] = 0;int num = (int) Math.ceil(Math.sqrt(n));for (int i = 0; i <= num; i ++) { // itemfor (int j = i * i; j <= n; j++) { // bagif (dp[j - i * i] != max)dp[j] = Math.min(dp[j - i * i] + 1, dp[j]);}}return dp[n] == max ? -1: dp[n];}
}

#LeetCode139. Word Break

#LeetCode139. 视频讲解:动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分_哔哩哔哩_bilibili

将输入的单词看作物品,字符串s 看作背包,题目变为考虑物品是否能装满背包的背包问题。

动态规划五部曲:

1. 确定dp[i] 数组的含义:字符串长为i ,如果能组成提供的单词,则dp[i] 为true

2. 递推公式:如果dp[j] 是true,且从j 到i 可以组成单词,那么dp[i] 为true

3. dp 数组初始化:dp[0] = true,无意义,因为给定的字符串非空,所以不存在组成0 个字符的空字符串的情况。

4. 确定遍历顺序:是一个排列问题,先背包后物品

5. 打印dp 数组:方便检查

代码:

class Solution {public boolean wordBreak(String s, List<String> wordDict) {HashSet<String> set = new HashSet<>(wordDict);boolean[] dp = new boolean[s.length() + 1];dp[0] = true;for(int i = 1; i <= s.length(); i++) { // bagfor(int j = 0; j < i && !dp[i]; j++) { // itemif(set.contains(s.substring(j, i)) && dp[j]) {dp[i] = true;}}}return dp[s.length()];}
}

http://www.mrgr.cn/news/27857.html

相关文章:

  • 用指针遍历数组
  • 使用 Python 和 OpenCV 实现摄像头人脸检测并截图
  • hive alter table add columns 是否使用 cascade 的方案
  • C++清除所有输出【DEV-C++】所有编辑器通用 | 算法基础NO.1
  • Bottom-Up Attention(借助CNN)
  • ChatGPT登录失败的潜在原因分析
  • python画图|同时输出二维和三维图
  • C++——哈希unordered_set/unordered_map的封装
  • 火语言RPA流程组件介绍--下拉框选择
  • 你可能遗漏的一些C#/.NET/.NET Core知识点
  • 高效网络爬虫设计:多线程抓取网页内容
  • AI学习指南深度学习篇-RMSprop算法流程
  • [产品管理-21]:NPDP新产品开发 - 19 - 产品设计与开发工具 - 详细设计与规格定义
  • linux服务器配置及服务器资源命令使用查看
  • UDP_SOCKET编程实现
  • Vue3 Day4-计算、监视属性
  • 松材线虫多光谱数据集
  • InputDispatcher的调试日志isLoggable动态开放logcat实战使用
  • 【退役之再次线上部署】Spring Boot + VUE + Nginx + MySQL
  • verilog运算符优先级
  • 堆排序,快速排序
  • C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)
  • Linux: virtual: qemu-kvm: top cpu usage的组成是否包含guest的使用?
  • 窗口嵌入桌面背景层(vb.net,高考倒计时特供版)
  • 基于双PI矢量控制结构和SVPWM的风力发电系统Simulink建模与仿真
  • C++线程库