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

代码随想录Day39|322. 零钱兑换、279.完全平方数、139.单词拆分

322. 零钱兑换

        dp[j]:装满容量为j的背包的最小元素个数。

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

        初始化:dp[0] = 0,因为要取最小值,所以待更新的区域都初始化成最大值。

        遍历顺序:因为不强调组合还是排列,只是求元素个数。

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];
        int max = Integer.MAX_VALUE -1;
        for(int i = 1; i<=amount;i++){
            dp[i] = max;
        }
        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],dp[j-coins[i]]+1);

                }
            }
        }
        return max == dp[amount]? -1:dp[amount];

    }
}

279.完全平方数

这题是自己用了个类似于查表法的思路,生成了个平方数的数组。看了题解后觉得自己很呆。

        dp[j]:装满容量为j的背包的最小元素个数。

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

        初始化:dp[0] = 0,因为要取最小值,所以待更新的区域都初始化成最大值。

        遍历顺序:因为不强调组合还是排列,只是求元素个数。

class Solution {
    public int numSquares(int n) {
        int[] nums = new int[101];
        for(int i = 1; i <nums.length;i++){
            nums[i] = i*i;
        }

        int[] dp = new int[n+1];
        int max = Integer.MAX_VALUE;
        for(int i = 1; i <=n; i++){
            dp[i] = max;
        }
        for(int i = 1; i < nums.length; i++){
            for(int j = 1; j<=n; j++){
                if(j - nums[i] >=0){
                    dp[j] = Math.min(dp[j],dp[j-nums[i]] + 1);
                }
            }
        }

        return dp[n];
    }
}

139.单词拆分

个人觉得这题不太好理解,但是好像其他同学觉得不难。

dp[i] : 背包为i容量,这里应该必须是从字符串的[0,i],能用字典单词组合成功为true,否则为false。

递推公式:dp[i] = set.contains(substring[j,i]) && dp[j]

这里dp[j]是加新单词之前的状态,如果新单词能找到,新单词之前的字符串也能找到,才输出dp[i]=true。

注意要判断下,再进入递归公式,有可能dp[i]本来已经为true了,但是新截取的字符串构不成单词,又给赋值成false了,所以不要每次都赋值。只要改过一次为true了就说明[0,i]是可以组合成功的。

遍历顺序:组合数,外层遍历背包。

初始化:dp[0] = true,其他都是false

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        Set<String> set = new HashSet<>(wordDict);
        boolean[] dp = new boolean[s.length() +1];
        dp[0] = true;

        //排列,外层遍历背包
        for(int i = 1; i <=s.length(); i++){
            for(int j =0;i > j;j++){
                if(set.contains(s.substring(j,i)) && dp[j]){
                    dp[i]= true;
                }
            }
        }
        return dp[s.length()];
    }
}


http://www.kler.cn/a/300282.html

相关文章:

  • WPS按双字段拆分工作表到独立工作簿-Excel易用宝
  • 【生产力工具】ChatGPT for Windows桌面版本安装教程
  • 讯飞星火大模型将超越chatgpt?
  • vue+高德API搭建前端Echarts图表页面
  • C# LINQ(Language Integrated Query)详解
  • 消息队列篇--原理篇--RocketMQ(NameServer,Broker,单机上每秒处理数百万条消息性能)
  • Kubectl:Kubernetes 的强大命令行工具
  • C++的智能指针
  • 通过ASCII码打印HelloWorld(花式打印HelloWorld)
  • 应用宝自动下载安装
  • 如何下载和安装 Notepad++
  • 【数据库】MySQL表的Updata(更新)和Delete(删除)操作
  • Spring 框架——@Retryable 注解与 @Recover 注解
  • 【delphi】判断多显示器下,程序在那个显示器中
  • C++day7
  • python 实现gaussian高斯算法
  • Vuex快速入门
  • mysql等相关面试题
  • Sentinel实时监控不展示问题
  • kali2023安装docker
  • SprinBoot+Vue老年医疗保健网站的设计与实现
  • 使用ffmpeg在视频中绘制矩形区域
  • 【重学 MySQL】十八、逻辑运算符的使用
  • CentOS系统上Node.js安装与配置最佳实践
  • IIS 反向代理模块: URL Rewrite 和 Application Request Routing (ARR)
  • Vuex:深入理解所涉及的几个问题