Ugly Number

Ugly number is a number that only have factors 3, 5 and 7.

Design an algorithm to find the Kth ugly number. The first 5 ugly numbers are 3, 5, 7, 9, 15 ...

Example

If K=4, return 9.

Challenge: O(K log K) or O(K) time.

动态规划

复杂度:时间 O(N) 空间 O(N)

解题思路:要得到第N个丑陋数,最直接的想法就是从1开始递增循环,直到找到第N个丑陋数,但是这样明显开销太大,而且我们没有用到已经生成的丑陋数的信息。如果有一个方法能够顺序只生成丑陋数就好了。仔细观察可以发现,丑陋数的因子也必定是丑陋数,它一定是某个丑陋数乘3、5、7得到的。但问题在于,小的丑陋数乘5不一定比大的丑陋数乘3要小,我们没法直接使用目前最大的丑陋数来乘3、5、7顺序得到更大的丑陋数。不过,我们可以确定的是,小的丑陋数3,肯定小于大的丑陋数乘3。所以我们使用三个指针,分别记录乘3、5、7得出的目前最大丑陋数,这样我们通过比较这三种最大丑陋数(这里最大是相对于只乘3、只乘5、只乘7三种不同情况下最大的丑陋数),就得到了所有数里最大的丑陋数。

public int nthUglyNumber(int n) {
    List<Integer> res = new ArrayList<Integer>();
    res.add(1);
    int i3 = 0, i5 = 0, i7 = 0;

    while(res.size() < n+1){
        int m3 = res.get(i3) * 3;
        int m5 = res.get(i5) * 5;
        int m7 = res.get(i7) * 7;
        int min = Math.min(m3, Math.min(m5, m7));

        res.add(min);
        if(min == m3) i3++;
        if(min == m5) i5++;
        if(min == m7) i7++;
    }
    return res.get(res.size()-1);
}

results matching ""

    No results matching ""