剑指 Offer(第2版)面试题 60:n 个骰子的点数

剑指 Offer(第2版)面试题 60:n 个骰子的点数

  • 剑指 Offer(第2版)面试题 60:n 个骰子的点数
    • 解法 1:递归
    • 解法 2:动态规划

剑指 Offer(第2版)面试题 60:n 个骰子的点数

题目来源:80. 骰子的点数

解法 1:递归

这样做会超时。

代码:

class Solution
{
public:vector<int> numberOfDice(int n){vector<int> ans;for (int i = n; i <= 6 * n; i++)ans.push_back(dfs(n, i));return ans;}// 辅函数 - 递归计算 n 个骰子丢出 point 点数的方案数int dfs(int n, int point){if (n < 0 || point < 0)return 0;if (point == 0)return n == 0;int count = 0;for (int i = 1; i <= 6; i++)count += dfs(n - 1, point - i);return count;}
};

复杂度分析:

时间复杂度:O(n!),其中 n 是骰子的个数。

空间复杂度:O(n),其中 n 是骰子的个数。

解法 2:动态规划

设 dp[i][j] 为丢 i 个骰子掷出 j 点的方案数。

初始化:dp[1][j] = 1,1<=j<=6。

代码:

class Solution
{
public:vector<int> numberOfDice(int n){if (n == 0)return {};// dp[i][j] 为丢 i 个骰子掷出 j 点的方案数vector<vector<int>> dp(n + 1, vector<int>(6 * n + 1, 0));// 初始化for (int j = 1; j <= 6; j++)dp[1][j] = 1;// 状态转移for (int i = 2; i <= n; i++)for (int j = i; j <= 6 * i; j++){// 状态转移方程for (int k = 1; k <= 6; k++)if (j - k >= 0)dp[i][j] += dp[i - 1][j - k];}vector<int> ans;for (int i = n; i <= 6 * n; i++)ans.push_back(dp[n][i]);return ans;}
};

复杂度分析:

时间复杂度:O(n2),其中 n 是骰子的个数。

空间复杂度:O(n2),其中 n 是骰子的个数。动态规划数组的空间开销是 O(n) * O(6n) = O(6n2)。

空间优化:

由于我们只需要用到最后一次的结果,因此为了节省空间可以使用滚动数组,将二维 dp 数组变为一维。

代码:

class Solution
{
public:vector<int> numberOfDice(int n){if (n == 0)return {};vector<int> dp(6 * n + 1, 0);// 初始化for (int i = 1; i <= 6; i++)dp[i] = 1;// 状态转移for (int i = 2; i <= n; i++){for (int j = 6 * i; j >= 0; j--){dp[j] = 0;for (int k = 6; k >= 1; k--){ // 最后一个骰子可以扔1-6点if (j - k >= 0)dp[j] += dp[j - k];}}}vector<int> res(dp.begin() + n, dp.end()); // 扔n个骰子的和为[n, 6*n]return res;}
};

复杂度分析:

时间复杂度:O(n2),其中 n 是骰子的个数。

空间复杂度:O(n),其中 n 是骰子的个数。动态规划数组的空间开销是 O(6 * n + 1)。

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

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

相关文章

共享单车之数据可视化

文章目录 第1关&#xff1a;绘制地图第2关&#xff1a;绘制流量最高的五条线路的路程图 第1关&#xff1a;绘制地图 任务描述 本关任务&#xff1a;使用JSP在百度地图上绘制一条共享单车起始路程。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 如何创建地…

进阶学习——Linux系统服务器硬件认识与RAID磁盘

目录 一、服务器知识补充 1.硬件 2.服务器常见故障 二、认识RAID 1.什么是RAID 2.RAID的优点 3.RAID的实现方式 三、RAID磁盘陈列 1.RAID 0 磁盘陈列介绍——RAID 0 2.RAID 1 磁盘陈列介绍——RAID 1 3.RAID 5 磁盘陈列介绍——RAID 5 4.RAID 6 磁盘陈列介绍——RA…

vr体验馆用什么软件计时计费,如遇到停电软件程序如何恢复时间

vr体验馆用什么软件计时计费&#xff0c;如遇到停电软件程序如何恢复时间 一、软件程序问答 如下图&#xff0c;软件以 佳易王vr体验馆计时计费软件V17.9为例说明 1、软件如何计时间&#xff1f; 点击相应编号的开始计时按钮即可 2、遇到停电再打开软件时间可以恢复吗&…

【开源】基于Vue+SpringBoot的公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

Redis经典五大类型源码及底层实现(一)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

LeetCode——2660. 保龄球游戏的获胜者

通过万岁&#xff01;&#xff01;&#xff01; 题目比较简单&#xff0c;就是给你两个数组&#xff0c;大小为n&#xff0c;分别表示n次投掷保龄球的得分。然后让你按照某种规则计算出最后的总得分&#xff0c;从而判断胜负。计算的规则就是如果出现了10分&#xff0c;那么接…

Linux CPU 数据 Metrics 指标解读

过去从未仔细了解过使用 top 和 htop 等命令时显式的CPU信息&#xff0c;本文我们详解解读和标注一下各个数据项的含义&#xff0c;同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识&#xff0c;很多查看CPU的命令行工具都是 cat /proc/stat 里的数据&#xff0c;所…

Spring-6-事务管理

事务是构建可靠企业级应用程序的最关键部分之一。 最常见的事务类型是数据库操作。 在典型的数据库更新操作中&#xff0c;首先数据库事务开始&#xff0c;然后数据被更新&#xff0c;最后提交或回滚事务(根据数据库操作的结果而定)。但是&#xff0c;在很多情况下&#xff0…

Dockerfile文件介绍

0 Preface/Foreword 0.1 Docker docker用来自制镜像。 1 Introduction 1.1 Dockerfile Dockerfile是用于定义Docker镜像的构建过程&#xff0c;它包含一系列的指令用于安装 软件包、配置环境等操作。 Dockerfile文件的格式如下&#xff1a; FROM base_image RUN apt-get up…

java中的缓冲类HeapByteBuffer和DirectByteBuffer的区别

使用之前写的文章里的例子 https://blog.csdn.net/zlpzlpzyd/article/details/135292683 HeapByteBuffer import java.io.File; import java.io.FileInputStream; import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.channels.FileChannel;public clas…

【hcie-cloud】【12】华为云Stack故障处理【故障处理通用处理原则、常见华为云Stack故障处理(计算域故障场景)】【上】

文章目录 前言故障处理通用处理原则故障处理流程故障信息收集及故障范围、类型识别ManageOne运维面收集告警信息AutoOps工具故障场景信息收集AutoOps工具自动化采集HCS信息 (1)AutoOps工具自动化采集HCS信息 (2)故障初期定位方向故障恢复例行维护讨论: 哪一环比较重要&#xff…

SQL面试题挑战08:补全缺失日的月销售累计

目录 问题&#xff1a;SQL解决&#xff1a;补充&#xff1a;repeat函数和space函数 问题&#xff1a; 现有一张员工的销售记录表&#xff0c;表样式如下。现在需要统计每个员工在2023年10月份&#xff0c;截止到每天的月累计销售额。注意&#xff1a;存在有的员工在某几天是没…

关于表格太大了jupyter无法单次处理的问题

记录下自己的心路历程…耗时耗精力 我用的数据库单个表格就很大&#xff0c;一个表格有30多G&#xff0c;jupyter无法处理这么大的表格&#xff0c;会直接把电脑的进程全部结束掉&#xff0c;结束掉要是能运行成功倒也行啊&#xff0c;然鹅…给我报错说处理不了&#xff0c;罢工…

【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码

文章目录 前言1.EnableEurekaServer2.初始化缓存3.jersey应用程序构建3.1注册jeseryFilter3.2构建JerseyApplication 4.处理注册请求5.registry&#xff08;&#xff09; 前言 前段时间遇到了一个业务问题就是k8s滚动发布Eureka微服务的过程中接口会有很多告警&#xff0c;当时…

vue路由传参

声明式导航传参 1 动态路由传参 路由规则path -> /article/:aid 导航链接 <router-link to"/article/1">查看第一篇文章</router-link> 组件获取参数: this.$route.params.aid 2 查询参数传参数 /路径?参数1值&参数2值 路由规则path ->…

next.js 开发网站的hello world

本文介绍建立一个简单的next.js 工程&#xff0c;以及简单修改。然后也简单说了2种路由方式的选择。 开始next.js工程前需要node.js &#xff0c; 还需要编辑器&#xff0c;我这里选择的是visual code。如果没有安装node.js 请参考下&#xff1a; visual code 下的node.js的he…

PathWave Device Modeling (IC-CAP) 建模系统——IC-CAP概述

建模系统 PathWave Device Modeling&#xff08;IC-CAP&#xff09;建模系统用于测量半导体器件并分析器件的电路建模特性以及分析所得数据。 要使用PathWave Device Modeling&#xff08;IC-CAP&#xff09;&#xff0c;您需要以下设置&#xff1a; 一台工作站执行直流、电…

linux端数据库管理工具推荐DBeaver

我的是 Ubuntu 系统安装步骤&#xff1a; 下载 DBeaver&#xff1a; 前往 DBeaver 的官方网站&#xff0c;选择适用于 Linux 的版本&#xff08;通常是以压缩包形式提供&#xff09;。 解压下载的文件&#xff1a; 打开终端&#xff0c;导航到下载的压缩文件所在的目录&#x…

今年近三万人报考北大研究生,最高学费80多万!

全国硕士研究生招生考试已经接近尾声&#xff0c;今年总共有近3万名考生报考北京大学硕士研究生。而北大计划招生的研究生是7349人&#xff0c;按这个比例计算的话相当于4:1&#xff0c;也就是平均 4 个人当中会有一个人被录取&#xff0c;我感觉这比高考容易多了。 2023年北大…

关于openssh 9.5 p1以上版本ssh-keygen -t rsa报错解决—— 筑梦之路

背景说明 执行命令ssh-keygen -t rsa 提示unknown key type rsa 执行命令ssh-keygen -t dsa 提示unknown key type dsa 从官方文档中看到9.5以后ssh-keygen 默认使用Ed25519加密算法&#xff0c;详情请阅读&#xff1a;OpenSSH: Release Notes 从官方文档中可查&#xff0c;…