【Leetcode】264. Ugly Number II ,丑数
原题
Write a program to find the n-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
Note that 1 is typically treated as an ugly number, and n does not exceed 1690.
Show Hint
Hint:The naive approach is to call isUgly for every number until you reach the nth one. Most numbers are not ugly. Try to focus your effort on generating only the ugly ones.
An ugly number must be multiplied by either 2, 3, or 5 from a smaller ugly number.
The key is how to maintain the order of the ugly numbers. Try a similar approach of merging from three sorted lists: L1, L2, and L3.
Assume you have Uk, the kth ugly number. Then Uk+1 must be Min(L1 * 2, L2 * 3, L3 * 5).
思路
不能够依次去判断每个数是不是丑数,这样时间复杂度会特别高。所以只能根据丑数来求下一个丑数。
我们知道丑数都是由已有的丑数乘以2、3、5得到的,所以核心目标就变成了找到下一个丑数,即从当前丑数里找到一个数,乘以2或3或5之后刚好大于当前最大丑数。于是,我们可以维护三个下标,分别记录A、B、C三个数,这三个数有这样的特点:
A*2 > maxUgly, B*3 > maxUgly, C*5 > maxUgly
然后我们再比较A*2, B*3和C*5哪个最小,这样它就是当前最大丑数了!
另外,每次求得当前最大丑数后,还需要更新A、B、C的下标,利用while循环就可以更新了。
代码
public class Solution {
public int min(int a, int b, int c) {
int t = a < b ? a : b;
return t < c ? t : c;
}
public int nthUglyNumber(int n) {
if(n <= 0) return -1;
//创建一个大小为n的数组存储前n个丑数
int[] u = new int[n];
u[0] = 1;
//创建三个下标分别记录第一个乘以2、3、5的乘积大于当前最大的丑数的下标
int index2 = 0;
int index3 = 0;
int index5 = 0;
//记录当前丑数个数
int cur = 1;
//记录当前最大的丑数的下标
int maxIndex = 0;
while(cur < n) {
//求丑数中乘以2、3、5中最小的数,作为下一个丑数
int m = min(u[index2] * 2, u[index3] * 3, u[index5] * 5);
u[cur++] = m;
//更新最大丑数下标
maxIndex++;
//更新index2,index3和index5,使得它们与2、3、5的乘积刚好大于当前最大丑数
while (u[index2]*2 <= u[maxIndex]) index2++;
while (u[index3]*3 <= u[maxIndex]) index3++;
while (u[index5]*5 <= u[maxIndex]) index5++;
}
return u[n-1];
}
}
【Leetcode】264. Ugly Number II ,丑数的更多相关文章
- [LeetCode] 264. Ugly Number II 丑陋数 II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- [LeetCode] 264. Ugly Number II 丑陋数之二
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- 264 Ugly Number II 丑数 II
编写程序找第 n 个丑数.丑数就是只包含质因子 2, 3, 5 的正整数.例如, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 就是前10个丑数.注意:1. 1 一般也被当做丑数2. ...
- [leetcode] 264. Ugly Number II (medium)
263. Ugly Number的子母题 题目要求输出从1开始数,第n个ugly number是什么并且输出. 一开始想着1遍历到n直接判断,超时了. class Solution { public: ...
- LeetCode——264. Ugly Number II
题目: Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime fact ...
- Leetcode 264. Ugly Number II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- (medium)LeetCode 264.Ugly Number II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- Leetcode264. Ugly Number II丑数2
编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 ...
- leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes
263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...
- [LeetCode] Super Ugly Number 超级丑陋数
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
随机推荐
- iOS Button设置
UIButton *kefuBtn = [[UIButton alloc]initWithFrame:CGRectMake(, , , )]; kefuBtn.backgroundColor = SX ...
- 【NOIP】2013提高组 花匠(摆花)
[算法]DP||贪心 [题解] (1)动态规划: 令f[i][0..1]为两种条件下前i株花的最大保留数量,状态转移方程: f[i][0]=max(f[j][1]+1) (j=i-1...1)(h[i ...
- hdu 2059 龟兔赛跑(动态规划DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059 龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others) M ...
- hdfs基本思想
1.hdfs的优缺点 (1)不适合大量小文件存储: (2)不适合并发写入,不支持文件随机修改:(只能append追加) (3)不支持随机读等低延时的访问方式 2.基本思想 主从结构 主节点, name ...
- Pythone3 sys模块
1.sys.argv 可以实现从程序外部向程序传递参数2.sys.exit() 程序中间退出,exit(0)正常退出,其他为异常退出3.sys.getdefaultencoding() 获取系统编码方 ...
- 1002: 当不成勇者的Water只好去下棋了---课程作业---图的填色
1002: 当不成勇者的Water只好去下棋了 Time Limit: 1 Sec Memory Limit: 128 MB Description 由于魔王BOSS躲起来了,说好要当勇者的Wate ...
- 使用while循环遍历文件
/* 使用while循环遍历文件*/ [root@localhost test1]# vim 17.py //add #!/usr/bin/python ll = open('/tmp/1.txt') ...
- cacti (不可以利用yum安装cacti的配置)
我们如果用yum不可以安装cacti,我们则可以利用tar包来安装!!! //cacti的配置准备 [root@localhost ~]# yum install -y epel-release [r ...
- strtok的用法(文件操作)
strtok :在一个字符串查找下一个符号 char *strtok( char *strToken, const char *strDelimit ); 返回值:返回指向在strToken字符串找到 ...
- js上传文件(图片)限制格式及大小为3M
本文保存为.html文件用浏览器打开即可测试功能 <form id="form1" name="form1" method="post&qu ...