代码随想录算法训练营第四十四天| 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 数组:方便检查

代码:

java 复制代码
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 数组:方便检查

代码:

java 复制代码
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 ++) { // item
            for (int j = i * i; j <= n; j++) { // bag
                if (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 数组:方便检查

代码:

java 复制代码
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++) { // bag
            for(int j = 0; j < i && !dp[i]; j++) { // item
                if(set.contains(s.substring(j, i)) && dp[j]) {
                    dp[i] = true;
                }
            }
        }
        return dp[s.length()];
    }
}
相关推荐
小O的算法实验室16 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生18 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿18 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz18 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能18 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****18 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能18 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能18 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo18 小时前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ018 小时前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法