题目

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

示例 1:

输入:n = 10

输出:12

解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

示例 2:

输入:n = 1

输出:1

解释:1 通常被视为丑数。

暴力法

求出int范围内所有的丑数,取第n个返回。

  1. public int nthUglyNumber(int n) {
  2. List<Integer> all=new ArrayList<>();
  3. for(long i=1;i<=Integer.MAX_VALUE;i*=2){
  4. for(long j=i;j<=Integer.MAX_VALUE;j*=3){
  5. for(long k=j;k<=Integer.MAX_VALUE;k*=5){
  6. all.add((int)k);
  7. }
  8. }
  9. }
  10. Collections.sort(all);
  11. return all.get(n-1);
  12. }

最小堆

这里使用优先队列。队中初始有一个元素值为1,每次出队一个元素,将这个元素乘以2,3,5的值依次入队,第n个出队的元素值即为结果。

  1. public int nthUglyNumber(int n) {
  2. //类型设置为long防止溢出
  3. PriorityQueue<Long> q=new PriorityQueue<>();
  4. q.offer(1L);
  5. long count=0,num=0;
  6. while(count<n){
  7. num=q.poll();
  8. count++;
  9. q.offer(num*2);
  10. q.offer(num*3);
  11. q.offer(num*5);
  12. //去重
  13. while(q.peek()==num) q.poll();
  14. }
  15. return (int)num;
  16. }

动态规划+三指针

我们先模拟手写丑数的过程:

1 打头,1 乘 2 1 乘 3 1 乘 5,现在是 {1,2,3,5}

轮到 2,2 乘 2 2 乘 3 2 乘 5,现在是 {1,2,3,4,5,6,10}

手写的过程和采用小顶堆的方法很像,但是怎么做到提前排序呢?

小顶堆的方法是先存再排,dp 的方法则是先排再存

我们设3个指针n2,n3,n5,代表的是第几个数的2倍、第几个数3倍、第几个数5倍

动态方程:dp[i]=min(dp[n2]*2,dp[n3]*3,dp[n5]*5)

小顶堆是一个元素出来然后存3个元素,动态规划则是标识3个元素,通过比较他们的2倍、3倍、5倍的大小,来一个一个存。

  1. public int nthUglyNumber(int n) {
  2. int[] dp=new int[n];
  3. dp[0]=1;
  4. int n2=0,n3=0,n5=0;
  5. for(int i=1;i<n;++i){
  6. dp[i]=Math.min(dp[n2]*2,Math.min(dp[n3]*3,dp[n5]*5));
  7. //每个判断都要用单独的if,不能用else if,因为可能有重复
  8. if(dp[i]==dp[n2]*2) n2++;
  9. if(dp[i]==dp[n3]*3) n3++;
  10. if(dp[i]==dp[n5]*5) n5++;
  11. }
  12. return dp[n-1];
  13. }

原题:264.丑数II

参考:暴力+优先队列(小顶堆)+动态规划(三指针)

264.丑数II的更多相关文章

  1. Leetcode之动态规划(DP)专题-264. 丑数 II(Ugly Number II)

    Leetcode之动态规划(DP)专题-264. 丑数 II(Ugly Number II) 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n ...

  2. Java实现 LeetCode 264 丑数 II(二)

    264. 丑数 II 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, ...

  3. 刷题-力扣-264. 丑数 II

    264. 丑数 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/ugly-number-ii/ 著作权归领扣网络所有.商业转载请 ...

  4. leetcode 264. 丑数 II 及 313. 超级丑数

    264. 丑数 II 题目描述 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, ...

  5. Leetcode 264.丑数II

    丑数II 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10 ...

  6. Leetocde的两道丑数题目:264. 丑数 II➕313. 超级丑数

    Q: A: 用变量记录已经✖2.✖3.✖5的元素下标i2.i3.i5.表示截止到i2的元素都已经乘过2(结果添加到序列尾部的意思),i3.i5同理.这样每次可以循环可以O(1)时间找到下一个最小的丑数 ...

  7. LeetCode——264. 丑数 II

    编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 ...

  8. 264. 丑数 II

    编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 ...

  9. 力扣:丑数II和数组中前K大的元素

    数组中的第K个元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k ...

随机推荐

  1. 第20篇-加载与存储指令之ldc与_fast_aldc指令(2)

    ldc指令将int.float.或者一个类.方法类型或方法句柄的符号引用.还可能是String型常量值从常量池中推送至栈顶. 这一篇介绍一个虚拟机规范中定义的一个字节码指令ldc,另外还有一个虚拟机内 ...

  2. FastAPI(1)- 简单介绍

    前言 为啥要学它呢,因为学 Flask 的时候发现有人更推荐它代替 Flask,看了下介绍,感觉很强,而且也能拿来做平台,当然学起来!卷起来! 为什么要使用 FastAPI ? 日渐没落的是后端 HT ...

  3. Vue Abp vNext获取当前登录用户

    系统默认提供了获取当前用户的api方法 https://localhost:44364/api/identity/my-profile 手工实现方法:abp后台获取当前用户需要在AppService应 ...

  4. C#提取程序的图标

    需要添加对System.Management.dll的引用  ,并且不要忘记导入下面的名称空间. using System.Management; 将ListView和  ImageList控件从可视 ...

  5. CodeForce-792C Divide by Three(数学)

    Divide by Three CodeForces - 792C 有一个正整数 n 写在黑板上.它有不超过 105 位. 你需要通过删除一些位使得他变成一个美丽的数,并且需要删除尽量少的位数.删除的 ...

  6. git报错:Auto Merge Failed; Fix Conflicts and Then Commit

    本文来源:http://blog.csdn.net/trochiluses/article/details/101007191.出错场景: 协同开发时,我们从远程服务器上pull下代码的时候,出现以下 ...

  7. 3gcms-Flash幻灯片上传后图片模糊解决办法

    很简单,不用纠结,直接修改admin/lib/action/FileAction.class.php 将 $upload->thumbMaxWidth='300'; //以字串格式来传,如果你希 ...

  8. Java基础系列(16)- Scanner进阶使用

    了解更多的sanner方法 Ctrl+鼠标左键,点击[Scanner] 点击Structure 看到了Scanner类下面的所有方法,以及具体方法实现的底层封装逻辑 拓展例子_nextInt()获取和 ...

  9. Docker DevOps实战:Docker+Jenkins+Python+Pytest+Allure(1)- 创建Jenkins容器、安装Python环境、安装项目依赖类库、安装Allure报告插件

    前言: 本文实操笔记参照菠萝笔记,安装过程中的坑大家可以参考下 创建Jenkins容器 # 下载Jenkins镜像 [root@localhost ~]# docker pull jenkins/je ...

  10. Shell系列(32)- 双分支if语句判断Apache服务是否启动

    #!/bin/bash #截取httped进程,并把结果赋予变量test test=$(ps -aux | grep "httpd" | grep -v "grep&qu ...