题目

剑指 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. 丑数的更多相关文章

  1. 剑指 Offer 49. 丑数 + 小根堆 + 动态规划

    剑指 Offer 49. 丑数 Offer_49 题目详情 解法一:小根堆+哈希表/HashSet 根据丑数的定义,如果a是丑数,那么a2, a3以及a*5都是丑数 可以使用小根堆存储按照从小到大排序 ...

  2. 【Java】 剑指offer(49) 丑数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 我们把只包含因子2.3和5的数称作丑数(Ugly Number). ...

  3. 剑指 Offer 49. 丑数

    题目描述 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, ...

  4. 每日一题 - 剑指 Offer 49. 丑数

    题目信息 时间: 2019-07-03 题目链接:Leetcode tag:动态规划 小根堆 难易程度:中等 题目描述: 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求 ...

  5. [剑指offer] 49. 丑数

    通俗易懂的解释: 首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那 ...

  6. 【剑指Offer】丑数 解题报告

    [剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: ...

  7. 力扣 - 剑指 Offer 45. 把数组排成最小的数

    题目 剑指 Offer 45. 把数组排成最小的数 思路1 将整数数组转化成字符串数组 然后使用Arrays工具类的sort方法帮助我们排序 代码 class Solution { public St ...

  8. 刷题-力扣-剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...

  9. 【剑指offer】丑数

    把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. leetcode上也 ...

随机推荐

  1. CF158A Next Round 题解

    Content 有 \(n\) 个人参加比赛,第 \(i\) 名在第一轮的分数是 \(a_i\)(保证 \(a_i\geqslant a_{i+1}\))已知下一轮预计能进 \(k\) 人,当然如果有 ...

  2. AT2287 [ARC067B] Walk and Teleport 题解

    Content 一条直线上有 \(n\) 个城市,第 \(i\) 个城市的坐标为 \(x_i\).你在某一个城市内,每一次你可以按两种方式之一进行移动: 左右移动,每移动一个单位疲劳值增加 \(a\) ...

  3. java File 类对操作系统文件目录进行操作:增删查

    File类 1,概述 File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成. 2,构造方法 public File(Strin ...

  4. 初识requests

    Make a Request 一开始要导入 Requests 模块: >>> import requests 然后,尝试获取某个网页.本例子中,我们来获取 Github 的公共时间线 ...

  5. Lucene 基础类型

    Lucene 索引文件中,用一下基本类型来保存信息:1. Byte:是最基本的类型,长 8 位(bit).2. UInt32:由 4 个 Byte 组成.3. UInt64:由 8 个 Byte 组成 ...

  6. nim_duilib(12)之menu(2)

    introduction 更多控件用法,请参考 here 和 源码. 本文将介绍menu的选项注册回调 before starting 本文的代码基于上一篇 stage1 回到项目demo_xml, ...

  7. One Pixel Attack for Fooling Deep Neural Networks

    目录 概 主要内容 问题描述 Differential Evolution (DE) 实验 Su J, Vargas D V, Sakurai K, et al. One Pixel Attack f ...

  8. N-Empress

    全排列 基本思想:递归.散列 代码实现 #include<cstdio> const int maxn = 11; int n, P[maxn], hashTable[11] = {fal ...

  9. 生成器执行函数co 源码解读

    本文所选内容均来自[co模块源码] /** * slice() reference. */ var slice = Array.prototype.slice; module.exports = co ...

  10. Java初学者作业——编写 Java 程序,让用户输入指定数字实现产生随机数。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,让用户输入指定数字实现产生随机数.运行效果如下: 实现思路: 定义两个变量start和end来保存起始和结束值. 通过结束值减起始值得到变化 ...