剑指 Offer 49. 丑数 + 小根堆 + 动态规划
剑指 Offer 49. 丑数
Offer_49
题目详情

解法一:小根堆+哈希表/HashSet
- 根据丑数的定义,如果a是丑数,那么a2, a3以及a*5都是丑数
- 可以使用小根堆存储按照从小到大排序的丑数。

package com.walegarrett.offer;
import java.util.HashMap;
import java.util.PriorityQueue;
/**
* @Author WaleGarrett
* @Date 2021/2/8 21:39
*/
/**
* 题目详情:编写一个程序,找出第 n 个丑数。
* 丑数就是质因数只包含 2, 3, 5 的正整数。
*/
public class Offer_49 {
public int nthUglyNumber(int n) {
PriorityQueue<Long>queue = new PriorityQueue<>();
HashMap<Long,Integer>map = new HashMap<>();
queue.offer(1L);
int cnt = 0;
long now = 1;
while(cnt < n){
now = queue.poll();
if(!map.containsKey(now*2)){
queue.offer(now * 2);
map.put(now*2, 1);
}
if(!map.containsKey(now*3)){
queue.offer(now * 3);
map.put(now*3, 1);
}
if(!map.containsKey(now*5)){
queue.offer(now * 5);
map.put(now*5, 1);
}
cnt++;
}
return (int)now;
}
}
解法二:动态规划

/**
* 解法二:动态规划
*/
class Offer_49_2 {
public int nthUglyNumber(int n) {
int i2=0,i3=0,i5=0;
int now = 0;
int[] nums = new int[n];
nums[0] = 1;
for(int i=1;i<n;i++){
nums[i] = Math.min(nums[i2] * 2, Math.min(nums[i3] * 3, nums[i5] * 5));
if(nums[i] == nums[i2] * 2)
i2++;
if(nums[i] == nums[i3] * 3)
i3++;
if(nums[i] == nums[i5] * 5)
i5++;
}
return nums[n-1];
}
}
剑指 Offer 49. 丑数 + 小根堆 + 动态规划的更多相关文章
- 力扣 - 剑指 Offer 49. 丑数
题目 剑指 Offer 49. 丑数 思路1 丑数是只包含 2.3.5 这三个质因子的数字,同时 1 也是丑数.要计算出 n 之前全部的丑数,就必须将 n 之前的每个丑数都乘以 2.3.5,选取出最小 ...
- 【Java】 剑指offer(49) 丑数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 我们把只包含因子2.3和5的数称作丑数(Ugly Number). ...
- 每日一题 - 剑指 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 49. 丑数
题目描述 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, ...
- 【剑指Offer】丑数 解题报告
[剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: ...
- 【剑指offer】丑数
把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. leetcode上也 ...
- Go语言实现:【剑指offer】丑数
该题目来源于牛客网<剑指offer>专题. 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7.习惯上我们把1当做是第一个丑 ...
- 《剑指offer》丑数
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
随机推荐
- zjnu1181 石子合并【基础算法・动态规划】——高级
Description 在操场上沿一直线排列着 n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.允许在第一次合并前对调一 ...
- 向Pycharm中导入第三方包 && 更改Pycharm上镜像源
一.Pycharm本身导包 下载成功会这个样子(如下图) 但是有时因为包的版本太高,代码运行出错,此时需要选中右下角的Specify version,然后选择想要的版本即可 如果还出错,那就在命令行下 ...
- [已完成+附代码]CS:APP:Lab6-ShellLab
由于我的第五个实验的partB部分一直出问题.而且修了好久没解决先不管了 这个实验建议一定要认真读完csapp全书的第八章.不然可能会毫无思路.千万不要上来直接做. 0. 环境配置和实验下载 利用do ...
- C语言之库函数的模拟与使用
C语言之库函数的模拟与使用 在我们学习C语言的过程中,难免会遇到这样的一种情况: 我们通常实现一个功能的时候,费尽心血的写出来,却有着满满的错,这时却有人来告诉你说:这个功能可以用相应的库函数来实现. ...
- WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
title: WOJ1022 Competition of Programming 贪心 date: 2020-03-19 13:43:00 categories: acm tags: [acm,wo ...
- Leetcode 30 串联所有单词的子串 滑动窗口+map
见注释.滑动窗口还是好用. class Solution { public: vector<int> findSubstring(string s, vector<string> ...
- 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】
题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...
- 关于st表的推导
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+7; int st[maxn][32]; int a[ma ...
- shit leetcode edge testcases
shit leetcode edge testcases Merge Intervals try "use strict"; /** * * @author xgqfrms * @ ...
- HTML script tag type all in one
HTML script tag type all in one script type https://developer.mozilla.org/en-US/docs/Web/HTML/Elemen ...