算法------零钱兑换(Java版本)
题目
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1:输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:输入: coins = [2], amount = 3
输出: -1说明:
你可以认为每种硬币的数量是无限的。
解决方法
解决方法1:最快的方法:
class Solution {int ans=Integer.MAX_VALUE;public int coinChange(int[] coins, int amount) {//排序Arrays.sort(coins);dfs(coins,coins.length-1,amount,0);return ans==Integer.MAX_VALUE?-1:ans;}public void dfs(int[] coins,int index,int amount,int cnt){if(index<0){return;}//优先使用金额最大的值for(int c=amount/coins[index];c>=0;c--){int na=amount-c*coins[index];int ncnt=cnt+c;if(na==0){//如果说这里等于0 说明能够组成当前要求的值ans=Math.min(ans,ncnt);break;//剪枝1}//如果走到这一步 已经比之前的方法路径长了 那么不需要再遍历了if(ncnt+1>=ans){break; //剪枝2}dfs(coins,index-1,na,ncnt);}}
}
解决方法2:
思路:
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) {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 (res >= 0 && res < min)min = 1 + res;}count[rem - 1] = (min == Integer.MAX_VALUE) ? -1 : min;return count[rem - 1];}
}
解决方法3:
左边1-6表示 amount 的值,c1,c2,c3表示每一个币种的值,分别为1,2,3。
比如第一行第一列的意思是,如果我当前的amount 是 1, 那么减去一个c1,需要拼凑的剩余的金额是多少。很明显,是0.
比如第二行,也就是amount 是2 的那一行,对于c1列,减去一个c1还剩余1需要去拼凑。
然后每一行的amount,都等于左边c1,c2,c3 里面,最小的值,加上1,因为每一列c1,c2,c3计算的时候都会去减去一个c1,c2,c3对应的值,分别为1,2,3
public class Solution {public int coinChange(int[] coins, int amount) {int max = amount + 1;int[] dp = new int[amount + 1];Arrays.fill(dp, max);dp[0] = 0;for (int i = 1; i <= amount; i++) {for (int j = 0; j < coins.length; j++) {if (coins[j] <= i) {dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);}}}return dp[amount] > amount ? -1 : dp[amount];}
}
想法:
1.不懂算法的人,怎么能明白计算机的好处呢?
当你看到有些算法题目,简单的用眼睛可以看到结果的时候,可能要花点时间才能用计算机写出来解决方法,你会想,计算机简直浪费。还没有我眼睛和脑子好用。但是当数据过多的时候,出现大数据的时候,你会知道,一个很复杂巨大工作量的工作,可能在算法里面,就简单十几行,几十行代码。
尤其是在动态规划的时候。
2.算法最重要的是思路,而不是实现,所以以后做算法题的时候,要先想好逻辑。
算法------零钱兑换(Java版本)相关推荐
- 插入排序算法 java_排序算法实现-插入排序(Java版本)
原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...
- JAVA算法:走迷宫回溯算法设计(JAVA版本)
JAVA算法:走迷宫回溯算法设计(JAVA版本) 迷宫数组 int[][] maze = { {0, 1, 0, 0, 0}, {0, ...
- 算法----------快乐数 (Java版本)
编写一个算法来判断一个数 n 是不是快乐数.「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1.如 ...
- CSDN蓝桥杯算法题——题解Java版本——切面条
目录 题目:切面条 答案目标: 推导过程: 解析过程: 对照Java编码1: 对照Java编码2: 总结: 题目:切面条 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以 ...
- 网易实习面经中的算法题(java版本含注释)
目录 前言 7. 整数反转(中等) 9. 回文数(简单) 14. 最长公共前缀(简单) 20. 有效的括号(简单) 23. 合并K个升序链表(困难) 64. 最小路径和(中等) 103. 二叉树的锯齿 ...
- JavaScript算法 — 零钱兑换问题
一.问题 二.分析 背包问题. 构造一个初始全是最大值的一维数组dp,dp[i]就代表兑换i元所需要的最少硬币个数. 所以有:dp[i] = Math.min(dp[i], dp[i - j] + 1 ...
- 算法------------完全平方数(Java版本)
题目 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少.示例 1:输入: n = 12 输出: 3 解释: 12 ...
- java零钱换整程序_零钱兑换 Java
题目链接 凑成面值为 11 的最小硬币数可以由以下 3者的最小值得到: 1.凑成面值为 10 的最小硬币数 + 面值为 1 的这一枚硬币: 2.凑成面值为 9 的最小硬币数 + 面值为 2 的这一枚硬 ...
- 微博短链接的生成算法(Java版本)
最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...
最新文章
- glibc(ptmalloc)内存暴增问题解决
- xgboost防止过拟合
- Ospaf项目-commits词频统计模块
- 几分钟了解阿里云云服务器ECS
- 博士毕业的人也会交“智商税”?现实远比我们想象的残酷……
- POJ-2773 欧几里得 + 二分 + 容斥
- (王道408考研数据结构)第五章树-第四节1:二叉树排序树(BST)及其操作
- 正交匹配追踪算法(OMP)
- 更新win7原版镜像中添加usb3.0驱动
- ADO 笔记 ——关于RecordCount
- 分享10个超级实用的Python自动化脚本
- 2.安装Clouda框架
- 中国朝代历史,名字的简介
- vue,el-image 图片引入根路径@无效
- 八年级上册历史知识点(第1课 鸦片战争)
- vim java win
- 竞技体育数据可视化与可视化分析综述
- flex布局设置宽度不生效,高度生效
- 网名闲话之“茶乡浪子”
- EBS: Inventory 模块的两个 package: INV_TXN_MANAGER_PUB INV_LPN_TRX_PUB