剑指 Offer 49. 丑数 + 小根堆 + 动态规划
2024-09-07 13:36:16
剑指 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];
}
}
最新文章
- POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心
- 装13失败后的逆袭(ComboBox的联动)
- MAC下彻底解决mysql无法插入和显示中文
- iPhone手机安全指南
- ubuntu实用技巧
- POJ 2101
- EIGRP默认路由分发的四种方法
- 【BZOJ】【1529】 【POI2005】ska Piggy banks
- jbpm与spring hibernate struts整合
- java 保留小数点后N位数(若干位),几种实现的方式总结
- iOS10适配——相机,通讯录,麦克风等权限设置
- 【模版 Floyd最小环】
- C\C++学习笔记 1
- Django 中间件 请求前
- sqlserver 级联删除、级联更新
- 五、regularized线性回归练习(转载)
- 交换机与VLAN
- Android中获取屏幕长宽的方法
- 2D Polygons( Poygon) CGAL 4.13 -User Manual
- 一步一步学习IdentityServer3 (5)
热门文章
- Git命令回退代码并同步到远程仓库
- 系统找不到C:\ProgramData\Oracle\Java\javapath\java.exe问题及解决方案
- 3.keepalived+脚本实现nginx高可用
- docker的企业级仓库-harbor
- woj1009 最短路 The Legend of Valiant Emigration
- 地址解析协议ARP与逆地址解析协议RARP
- confirm() :带有指定消息和 OK 及取消按钮的对话框
- 12.tomcat7切换tomcat8导致cookie异常
- Linux Centos7发送QQ邮件
- 树莓派 4B 入门教程