【剑指offer】丑数

题目链接:丑数

题意:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

题解:这题最开始是暴力做的。就是根据定义,依次做判断。然后TLE了。emmm...然后就有了接下来的解法。

因为这个number只包含2,3,5的因子,所以根据以2,3,5来做判断和维护。令number数组里的第一个元素为1。因为我们要让丑数数列有序,所以要每次使这三个因子组成的最小的数进入数组。

ugly:1

array 2: 2
array 3: 3
array 5: 5
比较(2,3,5)->min_n = 2,2进入ugly[]

ugly:1 2
array 2: 4
array 3: 3 6
array 5: 5 10

然后比较当前的值(4,3,5),3再进入ugly[]

怎么保证每次都是比较最前面的数呢。我们用做标记的方式实现。

i2,i3,i5来表示当前的位置。如果当前的number能除尽它们,指针就向后移。

代码:

 1 public class Solution {
 2     public int GetUglyNumber_Solution(int index) {
 3         if(index <= 0){
 4             return 0;
 5         }
 6         int []ugly = new int[index];
 7         int i2=0;
 8         int i3=0;
 9         int i5=0;
10         int cnt = 0;
11         ugly[0] = 1;
12         int num = 0;
13         while(cnt < index-1){
14             num = Math.min(ugly[i2]*2,Math.min(ugly[i3]*3,ugly[i5]*5));
15             if(num == ugly[i2] * 2)    i2++;
16             if(num == ugly[i3] * 3)    i3++;
17             if(num == ugly[i5] * 5)    i5++;
18             ugly[++cnt] = num;
19             
20         }
21         return ugly[index-1];
22     }
23 }
原文地址:https://www.cnblogs.com/Asumi/p/10489107.html