力扣 - 剑指 Offer 49. 丑数
题目
思路1
- 丑数是只包含 2、3、5 这三个质因子的数字,同时 1 也是丑数。要计算出 n 之前全部的丑数,就必须将 n 之前的每个丑数都乘以 2、3、5,选取出最小的那个数
- 但是如果每计算一个丑数都要将之前重新遍历一遍,时间复杂度较高
- 因此我们使用动态规划,创建一个dp数组,
dp[i]
代表第i + 1
个丑数,同时状态转移方程为:- \[\begin{cases} dp[a]×2>dp[i−1]≥dp[a−1]×2 \\ dp[b]×3>dp[i−1]≥dp[b−1]×3 \\ dp[c]×5>dp[i−1]≥dp[c−1]×5 \end{cases}
\] - \[dp[i]=\begin{matrix} min(dp[a]×2,dp[b]×3,dp[c]×5) \end{matrix}
\]
- 先初始化第一个丑数 1,然后我们再使用三个变量 a、b、c,分别代表在数组中的位置,作用是
dp[a/b/c]
乘2/3/5
得到丑数的结果,然后我们需要从这三个结果里面找到最小的那个丑数即为当前丑数,然后还要判断dp[i]
和dp[a]x2、dp[b]x3、dp[c]x5
是否存在相等,若相等则将对应索引a b c
加 1
代码
class Solution {
public int nthUglyNumber(int n) {
int[] dp = new int[n];
// 第一个丑数为1
dp[0] = 1;
// 从数组下标为0开始,a用于乘2,b用于乘3,c用于乘于5
int a = 0;
int b = 0;
int c = 0;
for (int i = 1; i < n; i++) {
// 计算下标对应的丑数
int t1 = dp[a] * 2, t2 = dp[b] * 3, t3 = dp[c] * 5;
// 选取三个丑数中最小的一个
dp[i] = Math.min(Math.min(t1, t2), t3);
// 查看刚刚选取的丑数,如果相等,下标进一位
// 这里得用三个if,因为我们不需要重复数,只要计算过了,同样可以直接跳过
if (dp[i] == t1) {
a++;
}
if (dp[i] == t2) {
b++;
}
if (dp[i] == t3) {
c++;
}
}
return dp[n-1];
}
}
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(N)\)
力扣 - 剑指 Offer 49. 丑数的更多相关文章
- 剑指 Offer 49. 丑数 + 小根堆 + 动态规划
剑指 Offer 49. 丑数 Offer_49 题目详情 解法一:小根堆+哈希表/HashSet 根据丑数的定义,如果a是丑数,那么a2, a3以及a*5都是丑数 可以使用小根堆存储按照从小到大排序 ...
- 【Java】 剑指offer(49) 丑数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 我们把只包含因子2.3和5的数称作丑数(Ugly Number). ...
- 剑指 Offer 49. 丑数
题目描述 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, ...
- 每日一题 - 剑指 Offer 49. 丑数
题目信息 时间: 2019-07-03 题目链接:Leetcode tag:动态规划 小根堆 难易程度:中等 题目描述: 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求 ...
- [剑指offer] 49. 丑数
通俗易懂的解释: 首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那 ...
- 【剑指Offer】丑数 解题报告
[剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: ...
- 力扣 - 剑指 Offer 45. 把数组排成最小的数
题目 剑指 Offer 45. 把数组排成最小的数 思路1 将整数数组转化成字符串数组 然后使用Arrays工具类的sort方法帮助我们排序 代码 class Solution { public St ...
- 刷题-力扣-剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...
- 【剑指offer】丑数
把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. leetcode上也 ...
随机推荐
- Android工具 - 随机测试(猴子)
原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6697535 本文章的前提:已经安装了Eclipse和ADT.androi ...
- Win7远程连接问题:凭据不工作 & 没有授权此用户账户
一 您的凭据不工作 1.问题描述 win7系统远程桌面到某个电脑的一个账户名为admin 的用户,但提示"您的凭据不工作,之前连到 *.*.*.*的凭据无法使用,请输入新凭据",即 ...
- UMDCTF 2021
6道pwn题,4道可以做.剩下一道题是arm架构,一道题是内核,溜了溜了. Jump_Not_Easy 1 from pwn import * 2 3 p = process('./pwn') 4 e ...
- Niushop开源商店渗透测试
靶机 提取码:le8l 首先连上靶机 先扫一下靶场ip,看看开启了哪些端口 开启了80端口,扫描一下目录 一个shop的界面, 一个admin后台管理界面 其他的目录翻看了一下, 看样子是网站的配置文 ...
- mongodb 64位操作系统下载地址
下载地址:https://www.mongodb.org/dl/win32/x86_64
- C# 使用Fluent API 创建自己的DSL
DSL(Domain Specified Language)领域专用语言是描述特定领域问题的语言,听起来很唬人,其实不是什么高深的东西.看一下下面的代码: using FlunetApiDemo; v ...
- ACwing2.01背包问题
题目: 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大. 输出最 ...
- html5调用摄像头截图
关于html5调用音视频等多媒体硬件的API已经很成熟,不过一直找不到机会把这些硬件转化为实际的应用场景,不过近年来随着iot和AI的浪潮,我觉得软硬结合的时机已经成熟.那我们就提前熟悉下怎么操作这些 ...
- chrome/microsoft/brave等浏览器离线下载crx并安装(解决download interrupted)
重要网站 离线下载crx 问题描述 使用chrome/microsoft edge/ brave 下载chrome webstroe插件时,提示: download interrupted. 解决方案 ...
- 【LeetCode】 204. Count Primes 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 素数筛法 参考资料 日期 [LeetCode] 题目 ...