剑指offer-----丑数

1、题目描述

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

2、思路

思路一:直观但不够高效

从0开始,逐个判断是不是丑数。直到找到第N个丑数为止。

思路二:创建数组保存已经找到的丑数,用空间换时间的解法。

我们可以创建一个数组,里面的数字都是拍好序的丑数,每个丑数都是前面的丑数乘以2、3或者5得到的。

将1作为第一个丑数,将某个丑数乘以2,将某个丑数乘以3,将某个丑数乘以5,取三者的最小值作为下一个丑数。

3、代码(思路二)

public class Solution {
    public static int min(int a,int b,int c){
int min = a<b?a:b;
min = min<c?min:c;
return min;
}
    public int GetUglyNumber_Solution(int index) {
        if(index <= 0){
            return 0;
        }
        int i = 0;
int j = 0;
int k = 0;
int num = 1;
    int [] arr = new int[index];
    arr[0] = 1;
while(num < index){
arr[num] = min(arr[i]*2,arr[j]*3,arr[k]*5);
while(arr[i]*2 <= arr[num]){
i++;
}
while(arr[j]*3 <= arr[num]){
j++;
}
while(arr[k]*5 <= arr[num]){
k++;
}
num++;
}
return arr[num-1];
    }
}


猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/80863137