[Leetcode][第322题][JAVA][零钱兑换][回溯][记忆化搜索][动态规划]

【问题描述】[中等]


【解答思路】

1. 递归(超时)
class Solution {int res = Integer.MAX_VALUE;public int coinChange(int[] coins, int amount) {if(coins.length == 0){return -1;}findWay(coins,amount,0);// 如果没有任何一种硬币组合能组成总金额,返回 -1。if(res == Integer.MAX_VALUE){return -1;}return res;}public void findWay(int[] coins,int amount,int count){if(amount < 0){return;}if(amount == 0){res = Math.min(res,count);}for(int i = 0;i < coins.length;i++){findWay(coins,amount-coins[i],count+1);}}
}
2. 记忆化搜索 自上而下

在这里插入图片描述
可以看出在进行递归的时候,有很多重复的节点要进行操作,这样会浪费很多的时间。
使用数组 memo[ ] 来保存节点的值
memo[n]表示钱币 n+1可以被换取的最少的硬币数,不能换取就为 -1
findWay 函数的目的是为了找到 amount 数量的零钱可以兑换的最少硬币数量,返回其值 int

在进行递归的时候,memo[n]被复制了,就不用继续递归了,可以直接的调用

class Solution {int[] memo;public int coinChange(int[] coins, int amount) {if(coins.length == 0){return -1;}memo = new int[amount];return findWay(coins,amount);}// memo[n] 表示钱币n可以被换取的最少的硬币数,不能换取就为-1// findWay函数的目的是为了找到 amount数量的零钱可以兑换的最少硬币数量,返回其值intpublic int findWay(int[] coins,int amount){if(amount < 0){return -1;}if(amount == 0){return 0;}// 记忆化的处理,memo[n]用赋予了值,就不用继续下面的循环// 直接的返回memo[n] 的最优值if(memo[amount-1] != 0){return memo[amount-1];}int min = Integer.MAX_VALUE;for(int i = 0;i < coins.length;i++){int res = findWay(coins,amount-coins[i]);if(res >= 0 && res < min){min = res + 1; // 加1,是为了加上得到res结果的那个步骤中,兑换的一个硬币}}memo[amount-1] = (min == Integer.MAX_VALUE ? -1 : min);return memo[amount-1];}
}
3. 动态规划 自下而上

在这里插入图片描述

时间复杂度:O(N^2) 空间复杂度:O(N)

class Solution {public int coinChange(int[] coins, int amount) {// 自底向上的动态规划if(coins.length == 0){return -1;}// memo[n]的值: 表示的凑成总金额为n所需的最少的硬币个数int[] memo = new int[amount+1];// 给memo赋初值,最多的硬币数就是全部使用面值1的硬币进行换// amount + 1 是不可能达到的换取数量,于是使用其进行填充Arrays.fill(memo,amount+1);memo[0] = 0;for(int i = 1; i <= amount;i++){for(int j = 0;j < coins.length;j++){if(i - coins[j] >= 0){// memo[i]有两种实现的方式,// 一种是包含当前的coins[i],那么剩余钱就是 i-coins[i],这种操作要兑换的硬币数是 memo[i-coins[j]] + 1// 另一种就是不包含,要兑换的硬币数是memo[i]memo[i] = Math.min(memo[i],memo[i-coins[j]] + 1);}}}return memo[amount] == (amount+1) ? -1 : memo[amount];}
}

【总结】

1. 思路总结

回溯法-〉递归树-〉重复子问题-〉备忘录/动态规划
在这里插入图片描述

2.【数据结构与算法】【算法思想】【联系与区别】回溯 贪心 动态规划 分治

转载链接:https://leetcode-cn.com/problems/coin-change/solution/javadi-gui-ji-yi-hua-sou-suo-dong-tai-gui-hua-by-s/

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

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

相关文章

用BST解决729. My Calendar I 731. My Calendar II 732. My Calendar III

My Calendar的book方法实现指定开始时间、结束时间&#xff0c;在重叠次数要求不同的情况下怎么实现。 729 My Calendar I 要求任意两个事件之间不能重叠。如果要插入的事件和已经插入的事件不重叠&#xff0c;则插入&#xff1b;否则不插入。 731 MyCalendar II 要求任意三个…

第三十八期:如何在Windows 10上使用Windows Update目录驱动程序安装打印机

尽管Win10能够自动设置大多数打印机&#xff0c;但有时Windows Update可能会在安装设备驱动程序时遇到问题-尤其是在添加较旧的打印机时。 作者&#xff1a;佚名来源&#xff1a;Win10系统之家 图片来源&#xff1a;伏天氏(m.futianshuwu.com) 伏天书屋(futianshuwu.com)10月…

376 Wiggle Subsequence 贪心解法以及证明

376. Wiggle Subsequence 题目理解 给定一个数组&#xff0c;相邻两个数计算差值。差值排成的序列是正负相间的&#xff0c;那这个数组就是一个wiggle 数组。例如数组[1,7,4,9,2,5]&#xff0c;差值序列是(6,-3,5,-7,3)。原数组用坐标轴表示如下。 思路是&#xff1a;在一段…

【数据结构与算法】【算法思想】动态规划

贪心算法 回溯算法 分治算法 动态规划 贪心&#xff1a;一条路走到黑&#xff0c;就一次机会&#xff0c;只能哪边看着顺眼走哪边 回溯&#xff1a;一条路走到黑&#xff0c;无数次重来的机会&#xff0c;还怕我走不出来 (Snapshot View) 动态规划&#xff1a;拥有上帝视角&am…

第六十七期:Python爬虫44万条数据揭秘:如何成为网易音乐评论区的网红段子手

获取数据,其实逻辑并不复杂&#xff1a;爬取歌单列表里的所有歌单url、进入每篇歌单爬取所有歌曲url&#xff0c;去重、进入每首歌曲首页爬取热评&#xff0c;汇总。 作者&#xff1a;嗨学python来源&#xff1a;今日头条 获取数据 其实逻辑并不复杂&#xff1a; 爬取歌单列…

【小技巧】字符char与整型int的相互转换

char转int char与int的相互转化&#xff0c;联想ASCII码&#xff0c;字符‘0’对应的值为48&#xff0c;所以不能直接加减‘ ’ char ch9; int ch_intch-0;//此时ch_int9int转char int i9&#xff1b; char i_chi0;//此时i_ch9必须牢记的ASCII

第四十期:九个对Web开发者最有用的Python包,掌握这些,工资至少能涨涨

Matplotlib&#xff0c;正如其名称所暗示的那样&#xff0c;是一个用来绘制数学函数和模型的库;扩展了Numpy的作用&#xff0c;Matplotlib可以只用几行代码来创建图&#xff0c;条形图&#xff0c;散点图等诸多视觉表现。 作者&#xff1a;Python之眼来源&#xff1a;今日头条…

array专题9

新的一周&#xff0c;新的专题。array的中等难度的题目快要结束了。能感觉到进步&#xff0c;也依然能感觉到吃力。加油。 31 Next Permutation 思路&#xff1a;读懂了题意&#xff0c;知道是要求下一个排列数是什么。如果已经到最后一个了&#xff0c;那就返回最小的那个。…

[Leetcode][第214题][JAVA][最短回文串][KMP][RK]

【问题描述】[中等] 【解答思路】 1. 字符串哈希 复杂度 class Solution {public String shortestPalindrome(String s) {int n s.length();int base 131, mod 1000000007;int left 0, right 0, mul 1;int best -1;for (int i 0; i < n; i) {left (int) (((long)…

坏掉的项链Broken Necklace

题目描述 你有一条由N个红色的&#xff0c;白色的&#xff0c;或蓝色的珠子组成的项链(3<N<350)&#xff0c;珠子是随意安排的。 这里是 n29 的二个例子: 第一和第二个珠子在图片中已经被作记号。 图片 A 中的项链可以用下面的字符串表示&#xff1a; brbrrrbbbrrrrrbrrb…

[Leetcode][第557题][JAVA][反转字符串中的单词 III][遍历][String函数]

【问题描述】[简单] 【解答思路】 1. 遍历 开辟一个新字符串。然后从头到尾遍历原字符串&#xff0c;直到找到空格为止&#xff0c;此时找到了一个单词&#xff0c;并能得到单词的起止位置。随后&#xff0c;根据单词的起止位置&#xff0c;可以将该单词逆序放到新字符串当中…

第七十二期:爬虫爬的好,牢饭吃到饱?

前几天分享的一篇《只因写了一段爬虫&#xff0c;公司200多人被抓!》相信大家看了后都会发问&#xff0c;我只是个写爬虫的&#xff0c;跟我有什么关系?到底什么样的爬虫才不犯法?今天这篇会解答你所有的疑问。 作者&#xff1a;技术领导力 前几天分享的一篇爬虫被抓相信大…

如何在Swift中创建漂亮的iOS图表

通过图形和图表呈现数据是当今移动应用程序最显着的特征之一。iOS图表使应用程序看起来更漂亮&#xff0c;更有吸引力。 在本教程中&#xff0c;我们将向您展示如何使用代码示例在Swift中实现我们的iOS图表。我们将看一下Swift折线图&#xff0c;饼图以及条形图。 您可以找到许…

第七十四期:从bug看11种编程语言演化史,果然如今Python比较流行

在本文中&#xff0c;作者选择了 11 种非常流行的编程语言&#xff08;通过 Stack Overflow 标签出现的频率衡量&#xff09;&#xff0c;希望可以找出这些问题的共性及差异性。 作者&#xff1a;机器之心编译来源&#xff1a;机器之心 自 2008 年创办以来&#xff0c;Stack …

[Leetcode][第841题][JAVA][钥匙和房间][DFS][BFS]

【问题描述】[中等] 【解答思路】 当 xx 号房间中有 yy 号房间的钥匙时&#xff0c;我们就可以从 xx 号房间去往 yy 号房间。如果我们将这 nn 个房间看成有向图中的 nn 个节点&#xff0c;那么上述关系就可以看作是图中的 xx 号点到 yy 号点的一条有向边。 这样一来&#xff…

死磕 java同步系列之开篇

简介 同步系列&#xff0c;这是彤哥想了好久的名字&#xff0c;本来是准备写锁相关的内容&#xff0c;但是java中的CountDownLatch、Semaphore、CyclicBarrier这些类又不属于锁&#xff0c;它们和锁又有很多共同点&#xff0c;都是为了协同多线程的执行&#xff0c;都是一种同步…

第七十五期:Java 2019 生态圈使用报告,这结果你赞同吗?

这是国外一机构调查了 7000 名开发者得出来的 Java 2019 年生态圈工具使用报告&#xff0c;主要调查了 Java 版本、开发框架、web 服务器等使用情况。 作者&#xff1a;平头哥来源 这是国外一机构调查了 7000 名开发者得出来的 Java 2019 年生态圈工具使用报告&#xff0c;主…

[Leetcode][第486题][JAVA][预测赢家][动态规划][递归]

【问题描述】[中等] 【解答思路】 1.递归 复杂度 class Solution {public boolean PredictTheWinner(int[] nums) {return total(nums,0,nums.length-1,1) >0;}//turn 标记轮到谁了 正数表示先手 负数表示后手 public int total( int[]nums ,int start,int end,int tur…

linux-2.6.38 input子系统(用输入子系统实现按键操作)

一、设备驱动程序 在上一篇随笔中已经分析&#xff0c;linux输入子系统分为设备驱动层、核心层和事件层。要利用linux内核中自带的输入子系统实现一个某个设备的操作&#xff0c;我们一般只需要完成驱动层的程序即可&#xff0c;核心层和事件层内核已经帮我们做好了。因此这篇随…

LinkedList专题2

203 Remove Linked List Elements 思路&#xff1a;考虑1 &#xff1a; 可能有多个节点符合&#xff1b;考虑2&#xff1a;命中节点是head&#xff1b;考虑3&#xff1a;命中节点是尾节点&#xff1b;考虑4&#xff1a;命中节点是中间的普通节点。 学习1&#xff1a;在linked…