丑数

这是剑指offer上的一道算法题:

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

思路:

比较容易想到的是,对于数组arr,某些位置t2,t3,t5的数分别乘以2,3,5以后取最小值即为下一个丑数。
比如:
arr[0] = 1;
开始时,t2 = 0,t3 = 0, t5 = 0,
明显是arr[t2]*2最小,所以arr[0+1] = 2.
但是需要注意的是,如果arr[i] == arr[i-1]则舍弃arr[i].
比如前6个丑数:1,2,3,4,5,6
但是按上述算法第七个丑数为6,因为6已经存在,所以需要舍弃6。

代码实现如下:

import java.util.Scanner;

/**
 * @author Mengjun Li
 * @create 2017/10/14
 * @since 1.0.0
 */
public class Main1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            System.out.println(solve(n));
        }
    }

    public static int solve(int index) {
        if (index < 7)
            return index;
        //定义三个指针,分别表示当前位置的值应该和2,3,5相乘
        int t2 = 0, t3 = 0, t5 = 0;
        int i = 1;
        int[] arr = new int[index];
        arr[0] = 1;
        while (i < index) {
            arr[i] = Math.min(arr[t2] * 2, Math.min(arr[t3] * 3, arr[t5] * 5));
            if (arr[i] == arr[t2] * 2)
                t2++;
            else if (arr[i] == arr[t3] * 3)
                t3++;
            else
                t5++;
            //arr[i]不能和前一个丑数arr[i-1]相等,如果相等,对应的t2,t3,或者t5++,i则不变
            if (arr[i] > arr[i - 1])
                i++;
        }
        return arr[i - 1];
    }
}

测试结果:
输入
7
输出
8

你可能感兴趣的:(数据结构与算法,丑数)