dcddc

西米大人的博客

0%

丑数II

题目描述

设计一个算法,找出只含素因子2,3,5 的第 n 大的数。1也是一个丑数。

思路

  • 方法一
    每个丑数都是2*..3..5..的结果
    创建保存丑数的数组a,设a[0]=1
    用index2,index3,index5表示丑数分解包含了2、3、5的个数,初始化为0
    每次求min(a[indexk]*k),得到当前最小的丑数,写入数组,并将indexk++
    这样做即可保证a数组中能保存所有的按序排列的丑数,输出第a[n-1]个元素即可。

  • 方法二
    将1加入保存丑数的数组a,将2,3,5加入优先队列pq
    每次从pq取min,如果min与a[tmp]不等,数组保存min,并将min*2,3,5的值加入优先队列。如果相等,跳过。
    这样做,最终可以得到a[n-1]个元素即为结果

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int nthUglyNumber(int n) {
// Write your code here
int index2 = 0;
int index3 = 0;
int index5 = 0;
int[] res = new int[n];
res[0] = 1;
int count = 1;
while(count < n){
res[count] = min(res[index2]*2, res[index3]*3, res[index5]*5);
if(res[count] == res[index2]*2) index2++;
if(res[count] == res[index3]*3) index3++;
if(res[count] == res[index5]*5) index5++;
count++;
}
return res[--count];
}
private int min(int a1, int a2, int a3){
if(a1 < a2){
if(a1 < a3)
return a1;
else
return a3;
}else if(a2 < a3){
return a2;
}else{
return a3;
}
}

考差点

  • 优先队列
  • 数组下标的灵活运用