1. 程式人生 > >#leetcode#Ugly Numbers 2

#leetcode#Ugly Numbers 2

Write a program to find the n-th ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

Note that 1 is typically treated as an ugly number, and n

 does not exceed 1690.


=====================================================


演算法參考了, 核心思想就是所有的ugly number都可以通過 這個 ugly number 序列本身通過乘以2,3 或者 5 來得到,所有就有了 memorization 的過程,每一次選當前最小的放入 uglyNumber array當中

http://www.geeksforgeeks.org/ugly-numbers/

https://discuss.leetcode.com/topic/21791/o-n-java-solution


寫這個部落格是因為覺得自己的程式碼可讀性更好一些


public class Solution {
    public int nthUglyNumber(int n) {
        int[] uglyNumbers = new int[n];
        int idx2 = 0, idx3 = 0, idx5 = 0;
        uglyNumbers[0] = 1;
        for(int i = 1; i < n; i++){
            int cur2 = uglyNumbers[idx2] * 2;
            int cur3 = uglyNumbers[idx3] * 3;
            int cur5 = uglyNumbers[idx5] * 5;
            int cur = Math.min(Math.min(cur2, cur3), cur5);
            // can't use if else here because sometimes cur2 == cur3 or vise versa, for example, when idx2 == 2, idx3 == 1, then uglyNumbers[idx2] * 2 == 3 * 2 == 6, uglyNumbers[idx3] * 3 == 2 * 3 == 6, in this case, both idx2 and idx3 should move forward, otherwise, there will be duplicate 6 in the uglyNumber array
            if(cur == cur2)
                idx2++;
            if(cur == cur3)
                idx3++;
            if(cur == cur5)
                idx5++;
            uglyNumbers[i] = cur;
        }
        
        return uglyNumbers[n - 1];
    }
}