算法复习:丑数

来源:互联网 发布:apache 安装版下载 编辑:程序博客网 时间:2024/05/29 13:36

题目描述

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

解题思路

(1)常规方法:从1开始判断是否丑数。通过3个while循环将数除以2,3,5,初到除不尽为止,判断结果是否为1。然后累计丑数的个数即可。

(2)方法一的效率不高,即使不是丑数也需要进行计算。因此,我们可以不对非丑数进行计算。通过观察发现丑数是由更小的丑数乘以2,3或者5得到的,所以可以保存之前的丑数,我们可以保存三个下标,这三个下标的数乘以2,3或者5后的结果要刚大于最后一个丑数,这样就可以保证每次取得的丑数是最小的(需要按顺序)并且不会重复。

代码:

public static int GetUglyNumber_Solution(int index) {    if (index <= 0)        return 0;    int[] uglyNumbers = new int[index];    uglyNumbers[0] = 1;    int nextUglyIndex = 1;    //保存3个下标,这3个下标的数对应的乘积要比最新的丑数要大(避免重复计算相同的丑数)    int multiply2Index = 0;    int multiply3Index = 0;    int multiply5Index = 0;    while (nextUglyIndex < index) {        uglyNumbers[nextUglyIndex] = min(uglyNumbers[multiply2Index] * 2, uglyNumbers[multiply3Index] * 3,                uglyNumbers[multiply5Index] * 5);        while (uglyNumbers[multiply2Index] * 2 <= uglyNumbers[nextUglyIndex])            multiply2Index++;        while (uglyNumbers[multiply3Index] * 3 <= uglyNumbers[nextUglyIndex])            multiply3Index++;        while (uglyNumbers[multiply5Index] * 5 <= uglyNumbers[nextUglyIndex])            multiply5Index++;        nextUglyIndex++;    }    return uglyNumbers[nextUglyIndex - 1];}public static int min(int a, int b, int c) {    int min = a > b ? b : a;    min = min > c ? c : min;    return min;}
原创粉丝点击