原题

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];
}
}

最新文章

  1. AngularJS中的方法参数的问题
  2. HashMap原理与优化
  3. 微信微信JS-SDK 6.0.2 填坑笔记
  4. 剑指Offer——网易笔试之解救小易
  5. andriod 获取电池的信息
  6. HDU 4342History repeat itself 数学
  7. 使用 /proc 文件系统来访问 linux操作系统 内核的内容 &amp;&amp; 虚拟文件系统vfs及proc详解
  8. php throw new Excpetion()之后,程序还往下继续运行吗?
  9. Java笔记(十九)&hellip;&hellip;多线程
  10. HttpWebRequest BeginGetResponse EndGetResponse
  11. Eclipse中代码提示框的背景色修改
  12. office web apps部署(一)
  13. Xamarin android 的WebClient Json下载并存储本地及sqlite数据库
  14. 软件需求规格说明书(spec)
  15. spring cloud之坑,访问服务时找不到报404
  16. 消息 xxx,级别 16,状态 x,过程 sp_executesql,第 x 行 过程需要类型为 &#39;ntext/nchar/nvarchar&#39; 的参数 &#39;@statement&#39;。
  17. [Mysql]一些知识点
  18. python学习日记(流程控制习题)
  19. Hadoop记录-HDFS balancer配置
  20. windows修改自定义格式,有的程序写的不严谨的话会造成出错,就需要重置时间格式

热门文章

  1. 设置zookeeper开机自启动
  2. Linux下Tomcat重启脚本
  3. 嵌入式Nosql数据库——LiteDB
  4. 计蒜客 Goldbach Miller_Rabin判别法(大素数判别法)
  5. Super A^B mod C (快速幂+欧拉函数+欧拉定理)
  6. base--AuditResult
  7. Linux命令--hostname和uname
  8. Fiddler抓取HTTPS协议
  9. Percona XtraDB Cluster(PXC)原理
  10. IoT之车联网