leetcode 322. Coin Change硬币交换问题

2023-11-15

题目详细

描述

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

Example 1:

Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Example 2:

Input: coins = [2], amount = 3
Output: -1

解法一

思路

这类动态规划问题属于给定一个定值,然后给出一组数组,然后在满足约束条件下的最大值,像这样问题的动态规划是指从定值开始的动态规划,从0到总的amount,动态规划问题一个数组dp[amount+1],刚开始多有的dp[i] 元素值初始化为最大值。第一种方法是从上到下的动态规划问题:

  1. 当i==0时表示总值为0 ,此时dp[0]==0;
    dp[i] 表示总量为i下最少的货币交换方案,既然是最少的情况,那么必然就是+1的情况,每种货比使用一张 ,所以加1,达到尽量少的目的。
    下面就是一个过程图
    比如处理amount=3时,货币可以选择的1,2,3
  2. dp[i] = min(dp[i-coins[0]]+1 ,dp[i-coins[1]]+1, dp[i-coins[2]]+1, dp[i-coins[最后一个元素]]+1,dp[i]) 1<<i<<amount, 其中
public class mini_coin_change {
    //bottom_up 求解方法
    //最小的硬币交换问题
    public int solution(int []nums,int amount){
        if(nums.length==0|| amount==0) return 0;
        Arrays.sort(nums);
        int [] dp= new int [nums.length+1];
        Arrays.fill(dp,amount+1);
        dp[0]=0;
        for(int i=1;i<=amount;++i)
        {
            for(int j=0;j<nums.length;++j)
            {
                    if(nums[j]<i)
                    {
                    // 决定是加入这块硬币还是不加入的情况 dp[i]-nums[j]+1,代表加入,
                    dp[i]还是保持原来的数值 
                        dp[i] =Math.min(dp[i-nums[j]]+1,dp[i]);
                    }
            }
        }
        return dp[amount]<amount+1 ?dp[amount]:amount;
    }

}

复杂度分析

  • 空间复杂度为o(amount)
  • 时间复杂度为o(amount * number of coin),效率不是很好,像这道题目空间复杂度是下降不了的,不像其他题目可以压缩空间复杂度,只用一个两个数记录整体情况

解法二

思路:BFS+backtrack求解最小值问题

递归方法,跟上楼梯问题一样的思路, 问题拆分,比如当amount=6的时候,有n种解决方案,其中n代表货币可兑换的种类数,然后逐步递归下去,剪枝的条件是amount =0 的时候,然后选取一条长度最小的路径,分支数为可供选择的货币数木,每种情况对应一种情况
从//其中coinChange 比如amount=6,共三种货币1,2,3 则第一次循环使用 F(6-1=5), F(4),F(3),其中
//F(6) = MinF(5), F(4), F(3))+ 1,三种情况下的代码, res其中就代表每种情况下的返回值, 最后再加1操作,代码体:剪枝条件判断,for循环各种可能分支,判断选择最小的其中一个分支情况

代码(Java)

 
 public class Solution {
        public int coinChange(int[] coins, int amount) {        
        if (amount < 1) return 0;
        return coinChange(coins, amount, new int[amount]);
    }

    private int coinChange(int[] coins, int rem, int[] count) {
    //深度递归剪枝的条件要写在前面类似,类似全排列和subsets类型的问题
    //rem ==0 0
        if (rem < 0) return -1;
        if (rem == 0) return 0;
       // 这一步是正确的剪枝后的结果
        if (count[rem - 1] != 0) return count[rem - 1];
        int min = Integer.MAX_VALUE;
        for (int coin : coins) {
        
            int res = coinChange(coins, rem - coin, count);
            if(rem>=0)
                min=Math.min(res+1,min);
        }
        count[rem - 1] = (min == Integer.MAX_VALUE) ? -1 : min;
        return count[rem - 1];
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode 322. Coin Change硬币交换问题 的相关文章

  • 算法:双指针

    双指针 双指针是一种思想或一种技巧并不是特别具体的算法 具体就是用两个变量动态存储两个结点 来方便我们进行一些操作 通常用在线性的数据结构中 特别是链表类的题目 经常需要用到两个或多个指针配合来记忆链表上的节点 完成某些操作 常见的双指针方
  • 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文 http blog csdn net sup heaven article details 39313731 数据结构中常见的树 BST二叉搜索树 AVL平衡二叉树 RBT红黑树 B 树 B 树 B 树 转载 2014年09月16日
  • Mysql 数据库

    数据库基础 1 什么是数据库 用来存储数据 数据库可在硬盘及内存中存储数据 数据库与文件存储数据的区别 数据库本质也是通过文件来存储数据 数据库的概念就是系统的管理存储数据的文件 数据库介绍 本质就是存储数据的C S架构的socket套接字
  • netty handler的执行顺序(3)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 今天解决2个问题 1 handler在pipeline当中究竟是如何存储的 2 在遍历handler的过程中 会根据event的不同 调用不同的handler 这一点是如何
  • Sort List

    Sort a linked list in O n log n time using constant space complexity 题目要求用 O n log n 的时间复杂度和常数的空间复杂度来进行链表排序 O nlogn 的排序算
  • 白盒测试相关的一些知识

    在白盒测试中 可以使用各种测试方法进行测试 下面这篇文章 可能比较枯燥 如果不乐意读 可以先收藏 如果在你的工作中真遇到白盒测试的话 可以回过头再来看看 还是值得读一读 一般来说 白盒测试时要考虑以下5个问题 1 测试中尽量先用自动化工具来
  • 一文弄懂循环链表、双向链表、静态链表

    循环链表 双向链表 静态链表 三遍定律 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 1 循环链表 将单链表中终端结点的指针端由空指针改
  • (笔试前准备)字符串匹配算法总结

    我想说一句 我日 我讨厌KMP KMP虽然经典 但是理解起来极其复杂 好不容易理解好了 便起码来巨麻烦 老子就是今天图书馆在写了几个小时才勉强写了一个有bug的 效率不高的KMP 特别是计算next数组的部分 其实 比KMP算法速度快的算法
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法
  • 数据结构小白之插入排序算法

    1 插入排序 1 1 思路 将n个需要排序的元素看成两个部分 一个是有序部分 一个是无序部分 开始的时候有序表只有一个元素 无序表有n 1个元素 排序过程中每次从无序表中取出元素 然后插入到有序表的适当位置 从而成为新的有序表 类似排队 如
  • 『Python基础-15』递归函数 Recursion Function

    什么是递归函数 一种计算过程 如果其中每一步都要用到前一步或前几步的结果 称为递归的 用递归过程定义的函数 称为递归函数 例如连加 连乘及阶乘等 凡是递归的函数 都是可计算的 即能行的 递归就是一个函数在它的函数体内调用它自身 编程语言中的
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • 时间复杂度+常见复杂度解释

    前言 算法的效率 虽然计算机能快速的完成运算处理 但实际上 它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源 要想编写出能高效运行的程序 我们就需要考虑到算法的效率 算法的效率主要由以下两个复杂度来评估 时间复杂度 评估执行程序所
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • Linux下进程退出的几种形式

    进程退出 Linux 下进程的退出分为正常退出和异常退出两种 1 正常退出 a 在main 函数中执行return b 调用exit 函数 c 调用 exit 函数 2 异常退出 a 调用about函数 b 进程收到某个信号 而该信号使程序
  • 查找数组中第二大的数

    快速找出一个数组中的最大数 第二大数 思路 如果当 前元素大于最大数 max 则让第二大数等于原来的最大数 max 再把当前元素的值赋给 max 如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值 则要把当前元素的值
  • 用两个栈实现队列

    目录 一 栈的基本结构及其接口 二 我的队列结构定义 三 我的队列创建及其初始化 四 我的队列入队 五 我的队列出队 六 我的队列取队头元素 七 我的队列判空 八 我的队列销毁 一 栈的基本结构及其接口 栈的结构定义 typedef int
  • 牛客剑指offer刷题其他算法篇

    文章目录 构建乘积数组 题目 思路 代码实现 第一个只出现一次的字符
  • 按照层次遍历结果打印完全二叉树

    按照层次遍历结果打印完全二叉树 按照推论结果 l 层首个节点位置 2 h l 1 l 层节点间距 2 h l 1 1 编码实现 public static
  • 浅谈归并排序:合并 K 个升序链表的归并解法

    在面试中遇到了这道题 如何实现多个升序链表的合并 这是 LeetCode 上的一道原题 题目具体如下 用归并实现合并 K 个升序链表 LeetCode 23 合并K个升序链表 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到

随机推荐

  • 【目标检测】yolov5模型详解

    文章目录 一 Yolov5网络结构 1 1 Input 1 2 Backbone 1 2 1 Conv模块 1 2 2 C3模块 1 2 3 SPPF模块 1 3 Neck 1 4 Head 1 4 1 head 1 4 2 目标框回归 1
  • react函数组件

    react 创建组件有三种方式 函数式定义的无状态组件 es5原生方式React createClass定义的组件 es6形式的extends React Component定义的组件 这篇我们主要讲函数组件的使用 在函数组件里面是没有生命
  • python selenium爬虫自动登录实例

    一 概述 我们要先安装selenium这个库 使用pip install selenium 命令安装 selenium这个库相当于机器模仿人的行为去点击浏览器上的元素 这时我们要用到一个浏览器的驱动 这里我用的是谷歌浏览器 二 安装驱动 确
  • Golang RabbitMQ实现的延时队列

    文章目录 前言 一 延时队列与应用场景 二 RabbitMQ如何实现延时队列 实现延时队列的基本要素 整体的实现原理如下 三 Go语言实战 生产者 消费者 前言 之前做秒杀商城项目的时候使用到了延时队列来解决订单超时问题 本博客就总结一下G
  • C/C++ 内存管理(malloc/calloc/realloc、free 和 new 、 delete区别;内存泄漏)

    C C 内存分布 int globalVar 1 static int staticGlobalVar 1 globalVar和staticGlobalVar是在main函数之前初始化 在哪都能用 作用域是全局的 区别 它俩的链接属性不一样
  • 全景分割(Panoptic Segmentation)(CVPR 2019)

    全景分割 Panoptic Segmentation CVPR 2019 摘要 1 导言 2 相关工作 3 全景分割格式 4 全景分割度量 4 1 片段匹配 4 2 PQ计算 4 3 与现有度量的比较 5 全景分割数据集 6 人类一致性研究
  • PAL 和NTSC说明?

    PAL 720 576 25HZ NTSC 720 480 30HZ 576i是一种视频格式的缩写 字母 i 表示 隔行扫描 数字576表示水平方向有576条 扫描线 通常通常垂直分辨率为720或者704像素 换句话说 标准画质电视 SDT
  • STM32学习笔记:CAN总线的过滤器

    STM32 CAN控制器 提供了28个可配置的筛选器组 F1仅互联型才有28个 其他的只有14个 STM32 CAN控制器每个筛选器组由2个32位寄存器组成 CAN FxR1和CAN FxR2 x 0 27 根据位宽不同 每个筛选器组可提供
  • 使用cBioPortal查看TCGA肿瘤数据

    欢迎关注 生信修炼手册 cBioPortal整合了来自TCGA CCLE以及几个独立的大型肿瘤研究项目的数据 构建了一个易于使用的网站 不需要有深厚的计算机功底 也可以通过该网站查询 分析 可视化肿瘤的相关结果 针对该网站的使用 官方专门发
  • leetcode 322. Coin Change硬币交换问题

    题目详细 描述 You are given coins of different denominations and a total amount of money amount Write a function to compute th
  • 美国国家安全局(NSA)网络攻击主战武器NOPEN

    国家计算机病毒应急处理中心14日正式发布了美国国家安全局专用 NOPEN 远控木马分析报告 揭露了美国情治部门的网络间谍手段 国家计算机病毒应急处理中心 信息安全摘要 近日 国家计算机病毒应急处理中心对名为 NOPEN 的木马工具进行了攻击
  • 排序算法--冒泡排序

    冒泡排序 基本思想 实例演示 代码实现 基础实现 代码优化 基本思想 基本思想 冒泡排序 类似于水中冒泡 较大的数沉下去 较小的数慢慢冒起来 假设从小到大 即为较大的数慢慢往后排 较小的数慢慢往前排 直观表达 每一趟遍历 将一个最大的数移到
  • 雅可比(jacobi)迭代法 matlab实现

    clc clear n input 请输入矩阵阶数 n for i 1 n fprintf 请输入矩阵第 d行 n i A i input end A B 1 input 请输入B向量 n B for i 1 n x i 0 x2 i 0
  • 动态规划之完全背包问题

    完全背包问题 题目 有 N N N 种物品和一个容量为 V V V 的背包 每种物品都有无限件可用 放入第 i
  • javascript 的MD5代码备份,跟java互通

    var MD5 function string function RotateLeft lValue iShiftBits return lValue lt
  • mybatis 批量增加 Parameter '__frch_item_0' not found. Available parameters are [list]

    当在mybatis用到foreach的时候 会报这个错误Parameter frch item 0 not found Available parameters are list 会出现的几种解决方案 例子 sql view plain c
  • 【Linux操作系统】【综合实验二 vi应用与shell脚本编辑】【浅试编辑命令】

    文章目录 一 实验目的 二 实验要求 三 实验内容 1 继续练习Linux系统的文件类 目录类 进程管理类与磁盘操作类常用命令 并使用常见的选择项 2 了解ed ex行编辑器与Emacs全屏幕编辑器的工作模式 基本操作命令 3 掌握vi的编
  • 静态测试

    之前对 静态测试 一直不怎么理解 一直徘徊在为什么要进行静态测试 看了下面这几篇文章 突然觉得的柳暗花明了 目前我正在测试的项目xx让我烦心的问题终于找到出路了 http qa taobao com p 8017 http qa taoba
  • 资产收集的方法总结

    资产收集的方法总结 文章目录 资产收集的方法总结 前言 一 资产收集基本名词概念 二 相关收集方法 1 fofa 2 google搜索语法 3 logo 4 favicon ico 5 关键字 6 维基百科 7 天眼查 企查查 8 微信公众
  • 设计模式之UML类图该怎么画

    关于可维护 可复用 可扩展 灵活性好的理解 生活中 印刷术和活字印刷 当需要对某些内容修改时 印刷术只要有一丁点变化 就需要重头再来 而活字印刷只需要进行部分修改即可 可维护 只更改要更改的内容 可复用 之前的内容并非用完就无用 后面仍可使