丑数 II
问题描述
设计一个算法,找出只含素因子2,3,5 的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
注意事项
我们可以认为1也是一个丑数。
思路解析
看到题目第一想法是从2、3、5互相乘一个一个产生丑数放到数列,但是没想出来具体该怎么产生丑数数列,最后借鉴简书一位同学的答案,原文https://www.jianshu.com/p/efaf56f64c39
具体思路为
- 定义一个大小为n的数组u[n]用来存储有序丑数序列。
- 三个游标
u2,u3,u5分别表示乘以2或3或5取得过最新丑数。 - 下一个丑数等于
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) 收藏 举报
浙公网安备 33010602011771号