丑数 II

问题描述

设计一个算法,找出只含素因子235 的第 n 小的数。

符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...

 注意事项

我们可以认为1也是一个丑数。

 

思路解析

看到题目第一想法是从2、3、5互相乘一个一个产生丑数放到数列,但是没想出来具体该怎么产生丑数数列,最后借鉴简书一位同学的答案,原文https://www.jianshu.com/p/efaf56f64c39

具体思路为

  1. 定义一个大小为n的数组u[n]用来存储有序丑数序列。
  2. 三个游标u2,u3,u5分别表示乘以2或3或5取得过最新丑数。
  3. 下一个丑数等于min(u[u2]*2, u[u3]*3, u[u5]*5),并根据因子对u2或u3或u5递增。

最终代码为

 1 public class Solution {
 2     /**
 3      * @param n: An integer
 4      * @return: the nth prime number as description.
 5      */
 6     public int nthUglyNumber(int n) {
 7         // write your code here
 8         int [] u = new int[n];
 9         u[0] = 1;
10         int u2 = 0;
11         int u3 = 0;
12         int u5 = 0;
13         for (int i =1; i<n; i++){
14             u[i] = min(min(u[u2]*2, u[u3]*3), u[u5]*5);
15             if(u[i]/u[u2] == 2){
16                 u2++;
17             }
18             if(u[i]/u[u3] == 3){
19                 u3++;
20             }
21             if(u[i]/u[u5] == 5){
22                 u5++;
23             }
24         }
25         return u[n-1];
26     }
27     
28     public int min(int a, int b){
29         return a < b ? a : b;
30     }
31 }

LintCode运行时间 2730ms。

posted on 2018-04-19 11:29  truman_zhn  阅读(112)  评论(0)    收藏  举报