【问题描述】 面试题 08.11.硬币

硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)示例1:输入: n = 5输出:2解释: 有两种方式可以凑成总金额:
5=5
5=1+1+1+1+1

【解答思路】

1. 动态规划 二维数组

1.1 令 dp[i][j] 为遍历到当下这个硬币时,组成金额 j 的方法数目
1.2 有两种可能性
(1)当前这个硬币没有取,dp[i][j]=dp[i-1][j];
(2)当前这个硬币取了,dp[i][j]=dp[i][j-coins[i]]。最后的结果是两者的和
1.3 将状态转移方程翻译成代码,并处理边界条件

时间复杂度:O(NM) 空间复杂度:O(NM)
N :金额 M:硬币类型

class Solution {public int waysToChange(int n) {if (n < 5)return 1;if (n == 5)return 2;int[] coins = {1, 5, 10, 25};int[][] dp = new int[4][n + 1];// 当数量为0,1时,有1种表示法for(int i = 0; i < 4; ++i){dp[i][0] = 1;dp[i][1] = 1;}  // 当只有一种硬币时,只有1种表示法for(int i = 0; i <=n; ++i)dp[0][i] = 1;/** 状态:dp[i][j]表示[0...i]种硬币能组合为j的所有不同种数* 状态转移:取 或 不取 当前硬币coins[i]*/for (int i = 1; i < 4; ++i) {for (int j = 2; j <= n; ++j) {if (j >= coins[i])dp[i][j] = (dp[i][j - coins[i]] + dp[i - 1][j]) % 1000000007;elsedp[i][j] = dp[i - 1][j];}}return dp[3][n];}
}
2. 动态规划优化 一维数组

从上面的状态转移方程可以看出,dp[i][j]只与dp[i-1][j]和dp[i][j-coins[i]]有关,所以完全可以把第一个维度除掉,只用一个一维数组存储

时间复杂度:O(MN) 空间复杂度:O(N)
N :金额 M:硬币类型

public int waysToChange2(int n) {int[] dp=new int[n+1];int[] coins={1,5,10,25};for(int i=0;i<=n;i++)dp[i]=1;for(int i=1;i<4;i++){for(int j=1;j<=n;j++){if(j>=coins[i])dp[j]=(dp[j]+dp[j-coins[i]])%1000000007;}}return dp[n];
}

【总结】

1. 动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

2. 数组初始化
  • 一维数组

1.在定义时初始化。

 int[] arrays = {1, 2, 3, 4, 5};                    //简化int[] arrays = new int[]{1, 2, 3, 4, 5};      //完整格式 推荐

2.先定空间,随后赋值。

- int []age = new int[10];//动态初始化for (int i = 0; i < age.length; i++) {age[i] = i;}
  • 二维数组

1.在定义时初始化。

double[][] a = new double[][] {{1,2,3},{4,2,7}};
double[][] b = new double[][] {{3,3},{1,1},{2,2}};2.先定空间,随后赋值。

double [][] container = new double[3][4];
for(int i = 0; i < 3;i++) {
for(int j = 0; j < 4;j++) {
container[i][j] = 4.5;
}
}

3.DFS 全排思想(顺序有关) 不可以 无序方案
  • n = 6 时 ,输出次数3(实际2)
  • 1 1 1 1 1 1
  • 5 1
  • 1 5(重复)
    private int[] money = new int[]{1,5,10,25};  private int count = 0;public int waysToChange(int n) {if(n<5){return 1;}int i=0;conutSort(i,n);return  count;}void conutSort(int i,int n){if(i>n){return ;}if(i==n){count++;count = count % 1000000007;}if(i <n){for(int j= 0 ;j<4;j++){conutSort( money[j]+i, n);}}}

参考链接:https://leetcode-cn.com/problems/coin-lcci/solution/dong-tai-gui-hua-jian-dan-yi-dong-by-yuanninesuns/

[Leedcode][JAVA][面试题 08.11][硬币][动态规划]相关推荐

  1. LeetCode 面试题 08.11. 硬币 多种解法 完全背包问题

    面试题 08.11. 硬币   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部 ...

  2. 《程序员面试金典(第6版)》 面试题 08.11. 硬币(动态规划,组合问题,C++)

    题目描述 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算n分有几种表示法.(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5 输出:2 解 ...

  3. 程序员面试金典 - 面试题 08.11. 硬币(背包DP)

    文章目录 1. 题目 2. 解题 1. 题目 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算 n 分有几种表示法.(结果可能会很大,你需要将结果模上1000000007) 示 ...

  4. 【面试题 08.11】 硬币(动态规划)

    题目 题目链接 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算n分有几种表示法.(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5输出:2 ...

  5. [LeetCode](面试题 08.11)硬币

    题目 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算n分有几种表示法.(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5输出:2解释: 有 ...

  6. [Leedcode][JAVA][第983题][最低票价][动态规划]

    [问题描述][第983题][最低票价][中等] 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出.每一项是一个从 1 到 ...

  7. [Leedcode][JAVA][面试题 16.03. 交点]

    [问题描述]面试题 16.03. 交点 给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值.要求浮点型误差不 ...

  8. [Leedcode][JAVA][面试题 01.07][找规律][旋转数组]

    [问题描述] [面试题 01.07. 旋转矩阵] 示例 1:给定 matrix = [[1,2,3],[4,5,6],[7,8,9] ],原地旋转输入矩阵,使其变为: [[7,4,1],[8,5,2] ...

  9. [Leedcode][JAVA][面试题 16.18][模式匹配][字符串][枚举]

    [问题描述][中等] 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式.例如,字符串&quo ...

最新文章

  1. 【硬核技能】舒工自创bind绑定数据方法,类似angular和vue绑定数据原理
  2. 前腾讯AI Lab负责人张潼加入创新工场,任港科大创新工场联合实验室主任
  3. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
  4. 《c语言从入门到精通》看书笔记——第15章 存储管理
  5. 你一写长文章就焦虑拖延?
  6. java遍历字典_Java中的HashMap遍历和C#的字典遍历
  7. C++笔试记录 2021年9月16日
  8. transformer 中的注意力机制和胶囊网络中的动态路由:它们在本质上或许具有相似性
  9. 数据归一化处理方法_数据预处理:归一化和标准化
  10. Learning a Discriminative Feature Network for Semantic Segmentation(语义分割DFN,区别特征网络)...
  11. 软件设计师教程 第5版 下载
  12. z变换解差分方程例题_Z变换及差分方程求解.doc
  13. java 贝叶斯抠图_毕业论文 基于贝叶斯算法的自动抠图程序设计与实现.doc
  14. 为什么blender安装后无法打开_CAD软件打开图纸后钢筋符号无法读取的解决办法...
  15. 东芝2303am维护清零_东芝打印机2303A怎样清零?
  16. 2021届秋招提前批——携程数据分析笔试
  17. python培训课程-python培训课程
  18. 计算机网络应用基础总结,(完整版)计算机网络应用基础高教版对口高考复习资料总结...
  19. 【原创】自制操作系统知识储备(一)---流程篇
  20. 鞍点Saddle Point Locator

热门文章

  1. [大数据可视化]-saiku的源码包Bulid常见问题和jar包
  2. HDOJ 2037 今年暑假不AC 【贪心】
  3. Mantis-如何自定义流程状态
  4. Error:Artifact com.*******:war exploded: java.nio.file.InvalidPathException: Illeg
  5. EventBus使用实例,观察者模式
  6. nuxt引用static或者assets目录下资源注意事项
  7. 织梦留言板guestbook.htm加入头部导航
  8. oracle数据导入与导出
  9. java 多线程生产者_java-Runnable加锁实现生产者和消费者的多线程问题
  10. java 8 删选集合 和取集合中的字段重组成集合的使用