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

day38|leetcode 322零钱兑换,279.完全平方数,139.单词拆分

322. 零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1

你可以认为每种硬币的数量是无限的。

这题与零钱兑换II的区别在于本题需要返回最小数

动规五部曲:

(1)dp数组的含义:dp[j]代表凑成总金额为j所需的最少的硬币个数

(2)确定递推公式:dp[j-coins[i]]就是凑成j-coins[i]所需的最少的硬币个数,加上coins[i]就是dp[j]即dp[j-coins[i]]+1,由于求的是最小值,所以dp[j]=min(dp[j-coins]+1,dp[j]);

(3)初始化:dp[0]=0,由递推公式可知为了防止0覆盖之后的所有元素,除了dp[0]其他位置都应该初始化为非零数

(4)确定遍历顺序:由于求的是最小值,所以并不需要考虑组合数还是排列数

(5)打印dp数组

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int bagweight = amount;
        vector<int>dp(bagweight+1,INT_MAX);
        dp[0]=0;
        for(int i=0;i<coins.size();i++)//先遍历物品
        {
            for(int j=coins[i];j<=bagweight;j++)
            {
                if(dp[j-coins[i]]!=INT_MAX)//如果等于初始值就跳过
                   dp[j]=min(dp[j-coins[i]]+1,dp[j]);
            }
        }
        if(dp[bagweight]==INT_MAX)return -1;
        return dp[bagweight];
    }
};

279. 完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,14916 都是完全平方数,而 311 不是。

输入:n = 12
输出:3 
解释:12 = 4 + 4 + 4

题目分析:背包容量就是n,完全平方数就是物品

完全平方数就是i*i

动规五部曲:

(1)dp[j]含义:和为j的完全平方数的最少数量

(2)确定递推公式:dp[j]=min(dp[j-i*i]+1,dp[j]);

(3)初始化:dp[0]=0,为了防止后续的值被覆盖,除了dp[0]其他都应该初始化为INT_MAX

(4)确定遍历顺序:求最小值不强调组合数还是排列数

(5)打印dp数组

class Solution {
public:
    int numSquares(int n) {
        int bagweight = n;
        vector<int>dp(bagweight+1,INT_MAX);
        dp[0]=0;
        for(int j=0;j<=n;j++)//先遍历背包
        {
            for(int i=1;i*i<=j;i++)
            {
                dp[j]=min(dp[j-i*i]+1,dp[j]);
            }
        }
        return dp[bagweight];
    }
};

139. 单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

题意分析:字符串是s,单词是物品

动规五部曲:

(1)dp[j]含义:dp[j] : 字符串长度为i的话,dp[j]为true,表示可以拆分为一个或多个在字典中出现的单词

(2)确定递推公式:如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。

所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。

(3)初始化:由递推公式可知,dp[0]决定了后续的,所以dp[0]=true,其他设为false

(4)确定遍历顺序:先遍历背包后遍历物品,因为s="apple pen apple" 时s=apple+pen+apple,其他顺序不是s,所以强调顺序,也就是属于排列数

(5)打印dp数组

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
      unordered_set<string>wordSet(wordDict.begin(),wordDict.end());
      vector<bool>dp(s.size()+1,false);
      dp[0]=true;
      for(int j=1;j<=s.size();j++)//先遍历背包
      {
        for(int i=0;i<j;i++)//再遍历物品
        {
            string str = s.substr(i,j-i);
            if(wordSet.find(str)!=wordSet.end() && dp[i])
            {
                dp[j]=true;
            }
        }
      }
      return dp[s.size()];
    }
};


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

相关文章:

  • 动手学深度学习-3.2 线性回归的从0开始
  • 【C++】继承(下)
  • 响应式编程与协程
  • 汽车自动驾驶AI
  • 自定义数据集 ,使用朴素贝叶斯对其进行分类
  • 41. 缺失的第一个正数
  • 5.5.3 UML概述(一)事物
  • 深度学习篇---二维码预训练模型
  • 博通Emulex Secure HBA:后量子加密与零信任架构的存储网络革命
  • 定安县行政区划地图矢量格式cdr高清ai文件
  • MyBatis-Plus速成指南:基本CURD
  • [LeetCode]day13 19.删除链表的倒数第n个结点
  • springboot项目Redis统计在线用户
  • IFeatureWorkspace.CreateFeatureClass(),报错对COM组件的调用返回了错误 HRESULT E_FAIL
  • intra-mart框架学习笔记:如何找到框架自带页面
  • ComfyUI工作流 参考图像生成人像手办(SDXL版)
  • Nginx的路径匹配规则 笔记250203
  • python渗透开发 高阶段位之 waf绕过sql注入 sqlmap --temper模块开发以及框架逻辑修改 以及解释Temper是什么?
  • Elasticsearch Kibana的下载与安装
  • 关于kamailio重启后无法启动,chatgpt给出的解决方案
  • 排序算法--堆排序
  • C++多线程编程——基于策略模式、单例模式和简单工厂模式的可扩展智能析构线程
  • http请求中的headers和body内容设置
  • 毕业设计:基于深度学习的高压线周边障碍物自动识别与监测系统
  • 如可安装部署haproxy+keeyalived高可用集群
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.23 稀疏矩阵:CSR格式的存储与运算