算法学习——LeetCode力扣动态规划篇4(377. 组合总和 Ⅳ、322. 零钱兑换、279. 完全平方数、139. 单词拆分)

news2024/11/26 4:40:20

算法学习——LeetCode力扣动态规划篇4

在这里插入图片描述

377. 组合总和 Ⅳ

377. 组合总和 Ⅳ - 力扣(LeetCode)

描述

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

示例

示例 1:

输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。

示例 2:

输入:nums = [9], target = 3
输出:0

提示

1 <= nums.length <= 200
1 <= nums[i] <= 1000
nums 中的所有元素 互不相同
1 <= target <= 1000

代码解析

动态规划

和518零钱兑换II 的区别是

  • 518零钱兑换II 是组合数,有多少种组合
  • 此题是找排序数

如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环遍历物品。

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
       vector<int> dp(target+1 ,0);

       dp[0] = 1;
        for(int j=0 ; j<=target ;j++)
        {
            for(int i=0 ; i<nums.size() ;i++)
            {
                if(j>=nums[i] && dp[j] < INT_MAX - dp[j-nums[i]])
                {
                  dp[j] += dp[j-nums[i]];
                } 
                else dp[j] = dp[j];
            }
        }
       return dp[target];
    }
};

C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。

322. 零钱兑换

322. 零钱兑换 - 力扣(LeetCode)

描述

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

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

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

示例

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3
输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

提示

1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104

代码解析

动态规划

dp[j]:凑足总额为j所需钱币的最少个数为dp[j]

得到dp[j],只有一个来源,dp[j - coins[i]]。

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j]

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

首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1 ,INT_MAX);
       
        dp[0]=0;
        
        for(int i=0 ; i<coins.size() ; i++)
        {
            for(int j=0 ; j<=amount  ;j++)
            {
                if(j>=coins[i] && dp[j-coins[i]] != INT_MAX)
                {
                    dp[j] = min( dp[j], dp[j-coins[i]] + 1);
                }
            }
        }

        if(dp[amount]==INT_MAX) return -1;

        return dp[amount];
    }
};

279. 完全平方数

279. 完全平方数 - 力扣(LeetCode)

描述

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

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例

示例 1:

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

示例 2:

输入:n = 13
输出:2
解释:13 = 4 + 9

提示

1 <= n <= 104

代码解析

动态规划

和322零钱兑换完全一致

自己构建完全平方数组,作为价格数组
找到刚好装满背包,但使用金币数量最少的金币数

class Solution {
public:
    int numSquares(int n) {
        vector<int> sqrt_num;
        vector<int> dp(n+1,INT_MAX);
        int tmp = 1;
        while( pow(tmp,2) <= n )
        {
            sqrt_num.push_back(pow(tmp,2));
            tmp++;
        }
        dp[0]=0;
        for(int i=0 ;i<sqrt_num.size();i++)
        {
            for(int j=sqrt_num[i] ; j<=n ;j++)
                dp[j] = min(dp[j] , dp[j-sqrt_num[i]]+1 );
        }
        
        return dp[n];
    }
};

139. 单词拆分

139. 单词拆分 - 力扣(LeetCode)

描述

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

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

示例

示例 1:

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

示例 2:

输入: s = “applepenapple”, wordDict = [“apple”, “pen”]
输出: true
解释: 返回 true 因为 “applepenapple” 可以由 “apple” “pen” “apple” 拼接成。
注意,你可以重复使用字典中的单词。

示例 3:

输入: s = “catsandog”, wordDict = [“cats”, “dog”, “sand”, “and”, “cat”]
输出: false

提示

1 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s 和 wordDict[i] 仅由小写英文字母组成
wordDict 中的所有字符串 互不相同

代码解析

动态规划

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。
拆分时可以重复使用字典中的单词,说明就是一个完全背包!

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

dp[0]初始为true完全就是为了推导公式。

下标非0的dp[i]初始化为false,只要没有被覆盖说明都是不可拆分为一个或多个在字典中出现的单词。

dp[j]=true 来自于 dp[i]=true + 字串s(i,j-i)可以在字典中找到。
例如输入“leetcode” ,dp[ 0 ] 初始化为1 ,
dp[ 4 ] = 1 , 因为 dp[ 0 ] =1 ,字串 s( 0 , 4 - 0)即”leet“ 可以在字典找到
dp[ 8 ] = 1 , 因为 dp[ 4 ] =1 ,字串 s( 4 , 8 - 4)即”code“ 可以在字典找到

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        vector<bool> dp(s.size()+1 ,false);
        unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
        
        dp[0] = true;
        // dp[j]=true 来自于 dp[i]=true + 字串s(i,j-i)可以在字典中找到。
        for(int j = 1 ; j<=s.size() ; j++)//背包尺寸
        {
            for(int i = 0 ; i < j ;i++ )//字串长度
            {
                string word = s.substr( i , j-i );
                if(wordSet.find(word) != wordSet.end() && dp[i]==true )
                    dp[j] = true;
            }  
        }
        // for(auto it:dp) cout<<it<<' ';
        return dp[s.size()];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1563353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果手机系统文件浏览技巧:实现高效的文件查找与管理

​ 目录 引言 用户登录工具和连接设备 查看设备信息&#xff0c;电池信息 查看硬盘信息 硬件信息 查看 基带信息 销售信息 电脑可对手机应用程序批量操作 运行APP和查看APP日志 IPA包安装测试 注意事项 引言 苹果手机与安卓手机不同&#xff0c;无法直接访问系统文件…

linux shell命令(进程管理、用户管理)

一、进程的概念 主要有两点&#xff1a; 1.进程是一个实体。每一个进程都有它自己的地址空间&#xff0c;一般情况下&#xff0c;包括文本区域&#xff08;text region&#xff09;、数据区域&#xff08;data region&#xff09;和堆栈&#xff08;stack region&#xff09;…

浅显易懂的简单说一下jvm内存模型

说起JVM大家都知道&#xff0c;它是运行java代码的基础。那么关于JVM 内存模型是不是很模糊 我用通俗易懂的方式说一下 我们这里先介绍 JVM 堆内存 它有两大块 包括 新生代内存&#xff0c;和老年代内存 。 为啥分为这两块&#xff0c; 你可以这样理解&#xff0c;&#xff…

【图论】【拓扑排序】1857. 有向图中最大颜色值

本文涉及的知识点 图论 拓扑排序 LeetCode1857. 有向图中最大颜色值 给你一个 有向图 &#xff0c;它含有 n 个节点和 m 条边。节点编号从 0 到 n - 1 。 给你一个字符串 colors &#xff0c;其中 colors[i] 是小写英文字母&#xff0c;表示图中第 i 个节点的 颜色 &#xf…

代码随想录算法训练营DAY14|C++二叉树Part.1|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

文章目录 二叉树的递归遍历思路CPP代码 二叉树的迭代遍历思路前序遍历后序遍历后序遍历 二叉树的统一迭代法 二叉树的递归遍历 144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历 文章讲解&#xff1a;二叉树的递归遍历 视频讲解&#xff1a;每次写递归都要靠直…

寒冬已逝,“量子春天”正来

最近&#xff0c;全球对量子技术领域的私人投资有所下降&#xff0c;引发了一些观点认为这个领域可能正逐渐衰退。 政治家、资助者和投资者并不总是以科学为关注焦点。然而&#xff0c;某些科技领域偶尔会成为热点&#xff0c;正如20世纪50年代核能技术的兴起&#xff0c;那时人…

ios 之 netty版本swiftNio(socket创建)

SwiftNio 简介 用于高性能协议服务器和客户端的事件驱动、无阻塞的网络应用程序框架。 SwiftNIO是一个跨平台异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。 这就像Netty&#xff0c;但是为Swift写的。 Xcode引入swiftNio 在实…

联诚发2024第二季度高质量发展工作推进会议顺利召开

4月1日上午&#xff0c;联诚发LCF以“稳中创新•产业升级•高质量发展”为主题的第二季度企业高质量发展工作推进大会在联诚发深圳总部隆重召开。会议总结上一季度的工作成果&#xff0c;分析研判当前形势&#xff0c;谋划部署下一季度工作&#xff0c;团结动员公司全体职工凝心…

Web3:数字化社会的下一步

随着技术的不断进步和互联网的发展&#xff0c;我们正逐渐迈入一个全新的数字化社会阶段。在这个新的时代&#xff0c;Web3作为数字化社会的重要组成部分&#xff0c;将发挥着举足轻重的作用。本文将探讨Web3在数字化社会中的意义、特点以及对未来发展的影响。 1. 重新定义数字…

设计模式——行为型——责任链模式Chain Of Responsibility

请求类 public class ApproverRequest {private int type;//请求批准的类型private float price;//请求的金额private int id;//请求的编号 } 审批人抽象类 public abstract class ApproverPerson {protected ApproverPerson next;protected String name;//审批过程public a…

【好书推荐4】图机器学习

【好书推荐4】图机器学习 写在最前面编辑推荐内容简介作者简介目录前言/序言本书读者内容介绍 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能…

nut-ui中的menu 菜单组件的二次封装

这个菜单组件 一般可以直接用到项目里 如果复用性不强的话 直接使用 但是有一个问题 如果很多地方都需要用到这个组件 我们可以把这个组件二次封装一下 <template><div class"cinema-search-filter-component"><nut-menu><template #icon>&…

交流耦合和直流耦合

一、 AC和DC定义 在选择输入模式时&#xff0c;可能选择不同的耦合方式会影响到数据中的频率成分。大多数信号都有AC成分和DC成分&#xff0c;DC成分是0Hz的部分&#xff0c;对应时域信号中的直流分量&#xff08;或称为直流偏置&#xff09;&#xff0c;AC成分是信号中的交变部…

VCRUNTIME140_1.dll丢失是怎么回事?多种解决方法帮你搞定

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“vcruntime140_1.dll文件丢失”。那么&#xff0c;这个文件是什么&#xff1f;它的作用是什么&#xff1f;当它丢失时&#xff0c;会提示什么样的错误信息呢&#xff1f;本文将详细介绍vcru…

谷粒商城实战(009 缓存-分布式锁)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第158p-第p165的内容 分布式锁 原理和使用 使用下shell对产生的命令进行发送 查看 -> 撰写 -> 撰写栏 idea 选中的代码提取成方法 加锁…

使用tcpdump和wireshark进行服务器抓包分析

目录 前言 1.tcpdump简介 2.Wireshark简介 3.实际案例 4.代码示例 5.总结 前言 服务器抓包分析是一种非常常见和有效的网络故障排查和性能优化手段。通过捕获服务器上的网络流量&#xff0c;可以帮助我们深入了解服务器与其它设备之间的通信情况&#xff0c;发现问题并进…

基于8086贪吃蛇游戏系统方恨设计

**单片机设计介绍&#xff0c;基于8086贪吃蛇游戏系统方恨设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086的贪吃蛇游戏系统设计是一个结合了微处理器控制、游戏逻辑以及图形显示技术的综合性项目。该系统旨在通过8086微处理器…

JAVA----线程

线程 上回说到 进程 > 运行起来的程序 > 并发编程 > 多核 CPU 操作系统管理进程: 先描述 > PCB 结构体 来把进程的各种属性都表示出来再组织 > 通过链表数据结构把多个 PCB 串起来. PCB 核心属性(进程调度) pid 进程标识符内存指针, 该进程依赖的 指令…

NIKKI DENSO伺服驱动器维修NCR-CAB1A2D-801B

NEXSRT伺服驱动器维修NPSA-MU日机电装伺服维修ACTUS POWER&#xff0c;NCS-ZE12MDA/ZE1MDA-601A&#xff0c;NEXSRT日机电装伺服维修NCS-ZE12MDB-401A/NCS-ZAMDA-401AG。 NIKKI常见故障原因及处理方法&#xff1a; 1、电机在一个方向上比另一个方向跑得快&#xff1b; (1) 故…