[Leedcode][JAVA][面试题 08.11][硬币][动态规划]

【问题描述】 面试题 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/

image.png

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

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

相关文章

Java课程设计

目录 Magic-Towers一、团队课程设计博客链接团队博客地址二、个人负责模块或任务说明三、自己的代码提交记录截图四、课程设计感想Magic-Towers 一、团队课程设计博客链接 团队博客地址 二、个人负责模块或任务说明 任务分配  网络1713柳聪灵【组长】--Model游戏布局及障碍物的…

玩转oracle 11g(44):数据库发展历史

数据库发展历史 数据库技术从 20 世纪 60 年代开始到现在一共经历了三个发展阶段&#xff1a;  第一代是网状、层次数据库系统 网状 &#xff1a;通用电气公司 Bachman 等人在 1961 年开发成功的 IDS 层次 &#xff1a; IBM 公司在 1968 年开发的 IMS 第二代是关…

[Java学习资料] [成长之路]

[背景] 网上学习资料千千万万&#xff0c;成长之路千千万万&#xff0c;各取所需 JAVA基础 网站 https://www.runoob.com/java/java-tutorial.html https://www.w3cschool.cn/java/dict 公众号 书籍 算法 网站 labuladong https://github.com/labuladong/fucking-algo…

word 2013 题注、图注、插入图片自动修改大小、批量更新题注编号

1 、题注 图片下面的文字说明&#xff0c;如 图 1.1.1 2、图注 图的标题格式&#xff0c;可以右键修改段落为居中&#xff0c;选中图片&#xff0c;点下此格式快捷居中等其他格式 3、 题注插入 效果 如下 4、题注自动居中对齐 先点击图片--》居中&#xff0c;或者点图注居中…

玩转oracle 11g(45):关系数据库

关系数据库 关系模型 定义&#xff1a;以二维表的形式表示实体和实体之间联系的数据模型称为关系数据模型。 从模型的三要素角度看&#xff0c;关系模型的内容为&#xff1a; &#xff08; 1 &#xff09;数据结构&#xff1a;一张二维表格。 &#xf…

[剑指offer][JAVA]面试题[51][数组中的逆序对][归并排序]

【问题描述】面试题51.数组中的逆序对 &#xff08;困难&#xff09; 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例 1:输入: [7,5,6,4] 输出: 5限制&…

2019年1月16日【第三天学习】

2019年1月16日星期三 任务一、运行CrackMe1.exe&#xff0c;提示 "嗯&#xff0c;对了" 代表成功。首先修改exe使得出现成功提示&#xff0c;其次不修改exe输入正确的密码达到成功的目的。 hint:https://blog.csdn.net/Nagi_Way/article/details/68961121 使用.Net的…

玩转oracle 11g(46):图解oracle数据库

1构成 由实例和数据库构成 2构成 3市例 4构成

[Leedcode][JAVA][第46题][全排列][回溯算法]

【问题描述】 46.全排列 &#xff08;中等&#xff09; 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。示例:输入: [1,2,3] 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] ]【解答思路】 1. 回溯 时间复杂度&#xff1a;O(NN&#xff01;) 空间…

java学习(167):生产者消费者问题

class Ck {private char[] r1 new char[8];private int wp 0;public synchronized void shengchan(char aa) {while (wp r1.length) //满了try {this.wait();} catch (Exception e) {}this.notify();//叫醒另一个线程&#xff0c;当前线程处于就绪状态r1[wp] aa;wp;System.…

[Markdown语法][快速入门][CSDN]

Markdown语法Markdown学习资料【使用建议】快捷键目录标题文本样式列表链接代码片表格注释 & 注脚自定义列表LateX数字公式插入甘耐图插入UML图插入Mermaid流程图插入Flowchart流程图Markdown学习资料 「中文文案排版指北」 「官方文档」 [科学上网] 【使用建议】 Mark…

常用开发环境搭建配置教程(OneStall)

最近想要做一个小东西&#xff0c;用到了下面几个中间件或者环境&#xff1a; Java Tomcat Maven MongoDB ZooKeeper Node 并且恰好碰到腾讯云打折&#xff0c;云主机原价100多一个月&#xff0c;花了30块钱买了三个月。买下后立即动手准备开始环境配置。 说到环境&#xff0c;…

sqlserver:(1):sqlserver安装超详细

1第一步&#xff0c;下载对应的镜像文件链接&#xff1a; https://pan.baidu.com/s/1nBwjrukxCAMD4xLdYofPXA 提取码&#xff1a;9rv7 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 然后&#xff0c;点击左面安装&#xff0c;在显示页面中点击全新SQLServer独…

linux 5识别网卡,CentOS 5.5系统识别不了Atheros AR8151网卡怎么办?

在安装完CentOS 5.5系统后&#xff0c;有些人出现无法上网的现象&#xff0c;经检测发现是Atheros AR8151网卡识别不了&#xff0c;遇到这种问题不用怕&#xff0c;下面小编就给大家介绍下CentOS 5.5无法识别Atheros AR8151网卡的解决方法。现象前段时间&#xff0c;在一台电脑…

混合代码块 Markdown Leedcde

混合代码块 Markdown&#xff08;仅限Leedcode&#xff09; 使用说明 Markdown 语法 注意语言后有空格 &#xff01; 展示效果

java学习(168):java连接SQL server数据库

1安装sql server数据库 2打开eclipse写入以下代码 package sjk;import java.sql.*;public class Main {//这里可以设置数据库名称private final static String URL "jdbc:sqlserver://localhost:1433;DatabaseNametest";private static final String USER"sa&…

mongo:(1)nosql简介

MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 NoSQL 简介 NoSQL(NoSQ…

[Leedcode][JAVA][第33题][搜索旋转排序数组]

【问题描述】[33. 搜索旋转排序数组] [中等] 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如&#xff0c;数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值&#xff0c;如果数组中存在这个目标值&#xff0c;则返回它的索引&#xff0…

001. Ansible简介

一 简介 Ansible是一款极其简单的自动化运维工具, 基于Python开发, 集合了众多运维工具(puppet, cfengine, chef, func, fabric)的优点。 实现了批量系统配置, 批量程序部署, 批量运行命令等功能。 Ansible是基于模块工作的, 本身没有批量部署的能力。真正具有批量部署的是ansi…

mongo:(2)mongoDB简介

什么是MongoDB ? MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个…