【LeetCode: 322. 零钱兑换 | 暴力递归=>记忆化搜索=>动态规划 | 背包模型】

news2024/7/6 20:09:07

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力法
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 322. 零钱兑换

⛲ 题目描述

给你一个整数数组 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

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路

  1. 我们来简单的概括一下题目的意思,题目要求我们可以从coins数组中进行选择,每一个硬币可以多次选择,凑成amount的最少硬币数是多少呢?
  2. 比如此时我们从0到index(数组中某一个位置)位置一共凑齐了sum,sum小于amount,那么接下来我们该怎么办呢?我们是不是要从index位置继续开始,凑齐剩下值的最少硬币数。所以我们使用递归来解决该问题。
  3. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码

class Solution {
    public int coinChange(int[] coins, int amount) {
        return process(0,coins,amount)==Integer.MAX_VALUE?-1:process(0,coins,amount);
    }

    public int process(int i,int[] coins,int target){
        if(target==0) return 0;
        if(i>=coins.length||target<0) return Integer.MAX_VALUE;
        int min=Integer.MAX_VALUE;
        for(int j=i;j<coins.length;j++){
            int temp=process(j,coins,target-coins[j]);
            int p=temp!=Integer.MAX_VALUE?temp+1:Integer.MAX_VALUE;
            min=Math.min(min,p);
        }
        return min;
    }
}

🥦 运行结果

时间超限了,不要紧张,我们来继续优化它!
在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。

🥦 实现代码

class Solution {
    int[][] dp;
    public int coinChange(int[] coins, int amount) {
        int n=coins.length;
        dp=new int[n][amount+1];
        for(int i=0;i<n;i++) Arrays.fill(dp[i],-1);
        return process(0,coins,amount)==Integer.MAX_VALUE?-1:process(0,coins,amount);
    }

    public int process(int i,int[] coins,int target){
        if(target==0) return 0;
        if(i>=coins.length||target<0) return Integer.MAX_VALUE;
        if(dp[i][target]!=-1) return dp[i][target];
        int min=Integer.MAX_VALUE;
        for(int j=i;j<coins.length;j++){
            int temp=process(j,coins,target-coins[j]);
            int p2=temp!=Integer.MAX_VALUE?temp+1:Integer.MAX_VALUE;
            min=Math.min(min,p2);
        }
        return dp[i][target]=min;
    }
}

🥦 运行结果

我们发现,通过加一个缓存表,时间复杂度发生了翻天覆地的变化,真是不可思议!
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。

🥦 实现代码

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

🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

JavaScript 知识总结中篇(更新版)

72.get 请求传参长度的误区 常说&#xff1a;get 请求参数的大小存在限制&#xff0c;而 post 请求的参数大小无限制。 实际上 HTTP 协议并未规定 get / post 的请求参数大小限制。 纠正误区&#xff1a;是浏览器或 web 服务器对 get 请求参数的最大长度显示进行限制&#xf…

Nature Neuroscience:高家红团队首次发布中国人脑连接组计划研究成果及其大数据资源

人类生活在充满多样性的世界里。长久以来的研究发现&#xff0c;人类的脑与行为受到基因、环境和文化及其相互作用的塑造&#xff0c;然而这种影响发生的机制始终缺乏系统性探索与研究。近年来&#xff0c;前沿神经影像技术方法飞速进步&#xff0c;推动着多模态脑成像大数据集…

索尼ILCE-7SM3覆盖恢复案例

ILCE-7SM3算是索尼的流量级产品了&#xff0c;目前使用的比较多。今天我们来看一个格式化后又覆盖的恢复案例&#xff0c;看看这种情况下如何恢复残留的视频素材。 故障文件:80G SD卡 故障现象: 80G卡实际容量在74.5G左右&#xff0c;ExFat文件系统&#xff0c;格式化后又录…

Java8新特性-Stream

文章目录 简介Stream 的特性创建Stream通过集合创建流通过数组创建流通过Stream.of方法创建流创建规律的无限流创建无限流创建空流 Stream操作分类中间操作无状态filtermapflapMap 有状态distinctsortedreversedthenComparinglimitskipconcat 终结操作非短路操作forEachreducec…

D. Kilani and the Game(BFS模拟向四周漫延的过程)

Problem - D - Codeforces Kilani正在和他的朋友玩一个游戏。这个游戏可以表示为一个nm的网格&#xff0c;其中每个单元格都是空的或者被阻塞的&#xff0c;并且每个玩家在一些单元格中拥有一个或多个城堡&#xff08;一个单元格中没有两个城堡&#xff09;。 游戏分轮进行。每…

JS高级 -- 构造函数、数据常用函数

1. 深入对象 1.1 创建对象三种方式 利用对象字面量创建对象 const o {name:佩奇 }利用 new object 创建对象 const o new Object({ name:佩奇}) console.log(o) // {name: 佩奇}利用构造函数创建对象 1.2 构造函数 构造函数&#xff1a;是一种特殊的函数&#xff0c;主要…

SpringBoot+Vue3实现登录验证码功能

系列文章目录 Redis缓存穿透、击穿、雪崩问题及解决方法Spring Cache的使用–快速上手篇分页查询–Java项目实战篇全局异常处理–Java实战项目篇 Java实现发送邮件&#xff08;定时自动发送邮件&#xff09;_java邮件通知_心态还需努力呀的博客-CSDN博客 该系列文章持续更新…

最高效的七个云原生开发原则

​Cloud native是一种软件开发方法&#xff0c;利用云基础架构实现更快、更可扩展的部署。云原生应用程序旨在充分利用现代化的工程实践&#xff0c;如自动化、托管服务和自动扩展控制。 这种模式对组织文化和工作实践也有影响。云技术应成为软件交付的重要组成部分。每个人都…

迅为三星4412开发板UDP实现服务器和客户端

UDP 协议是开放式&#xff0c;无连接&#xff0c;不可靠的传输层通信协议&#xff0c;但它收发数据的速度相对于 TCP 快很多&#xff0c;常 用在传输音视频等数据量非常大的场合。 udp 网络编程只需要使用一个类 QUdpSocket。 本实验中对 QUdpSocket 的基本使用&#xff1a; …

选择DAO的组织结构时,应着重考虑的各个关键阶段与安全可靠性

近年来&#xff0c;去中心化自治组织 (Decentralized Autonomous Organizations&#xff0c;DAO)已成为了管理智能合约项目和社区的流行方式。简单而言&#xff0c;DAO是一个基于智能合约运作的数字化组织。组织内的成员可以根据对应的模型结构&#xff0c;做出不同的决策。虽然…

哪款蓝牙耳机学生用合适?学生党平价无线耳机推荐

近年来&#xff0c;蓝牙耳机凭借使用便捷&#xff0c;成为了许多人生活中不可或缺的一部分。不管是听歌、追剧还是玩游戏&#xff0c;或者运动等等&#xff0c;都能看到戴蓝牙耳机的人。那么&#xff0c;哪款蓝牙耳机适合学生用&#xff1f;下面&#xff0c;我来给大家推荐几款…

Unsupervised Learning of Depth and Ego-Motion from Video 论文精读

视频中深度和自我运动的无监督学习 摘要 我们提出了一个无监督学习框架&#xff0c;用于从非结构化视频序列中进行单眼深度和相机运动估计。与其他工作[10&#xff0c;14&#xff0c;16]一样&#xff0c;我们使用端到端的学习方法&#xff0c;将视图合成作为监督信号。与之前…

C++ 线程

linux使用线程 在linux使用线程可能出现&#xff0c;在编译时不会报错&#xff0c;但执行出错的问题。 undefined reference to pthread_create这是由于ubuntu平台下调用pthread_create()函数&#xff0c;pthread 库不是 Linux 系统默认的库&#xff0c;连接时需要使用静态库 …

Word转PDF:简单步骤,轻松完成!推荐两个实现的方法

随着社会的发展&#xff0c;PDF 文件已经成为一种非常流行的文件格式&#xff0c;对于一些需要对文件进行保密的企业而言&#xff0c;更是必不可少。在这样的大背景下&#xff0c;如何将 Word 文件转换为 PDF 文件呢&#xff1f;下面是一些简单的步骤&#xff0c;帮助您轻松完成…

Rust-Shyper:基于 Rust 语言的高可靠、开源嵌入式 Hypervisor

「Rust-Shyper 是北京航空航天大学计算机学院王雷教授团队设计开发的虚拟机监控器&#xff0c;该系统基于 Rust 语言&#xff0c;实现了一个高可靠、嵌入式 Hypervisor。2023 年 2 月 15 日 Rust-Shyper 正式在 openEuler 社区开源。」 项目地址&#xff1a;https://gitee.com…

论文阅读笔记:Hearing Lips Improving Lip Reading by Distilling Speech Recognizers

目录 论文链接 研究背景 LIBS 的整体框架 序列级知识蒸馏 上下文级知识蒸馏 最长公共子序列 (LCS) 帧级别知识蒸馏 论文链接 [1911.11502] Hearing Lips: Improving Lip Reading by Distilling Speech Recognizers (arxiv.org) 研究背景 这篇文章针对由于唇语识别动作…

【观察】解码“一网统管”:城市治理“新范式”,推动数字城市建设迈向“新高度”...

众所周知&#xff0c;随着城市化进程加快&#xff0c;大量的人员、物资、技术和信息等要素日益向城市汇聚&#xff0c;城市系统变得越来越复杂&#xff0c;随之而来的社会问题和“城市病”也层出不穷&#xff0c;而传统的治理模式和治理手段越来越难以胜任日益复杂城市的管理需…

深聊丨第四范式陈雨强:如何用AI大模型打开万亿规模传统软件市场?

文丨亲爱的数据 谭婧 “GPT大模型到底能不能用&#xff1f;用在哪里&#xff1f;” 这是目前中国大型企业一把手最关心的问题之一。AI大模型也被媒体称为“一把手”工程。 大型企业会非常认真地考虑大模型的应用。最近个把月&#xff0c;大型企业客户对大模型的热烈反应让第四范…

进程状态以及两种特殊进程

目录 进程状态1 具体状态2 进程状态的意义3 进程状态实例3.1 R&S&T认识3.2 认识Z & 僵尸进程 & 孤儿进程僵尸进程孤儿进程 进程状态 为了弄明白正在运行的进程是什么意思&#xff0c;我们需要知道进程的不同状态。一个进程可以有几个状态&#xff08;在Linux内…

==、equals区别 | java学习笔记

做一些java基础知识的记录&#x1f4d5; java基本类型&#xff1a;byte short int long float double char boolean&#xff08;指向具体的数值&#xff09; java引用类型&#xff1a;类 接口 数组等。指向的不是具体的数值&#xff0c;而是指向了对象的地址。 用于判断基本类…