設計一個算法,找出只含素因子2,3,5 的第 n 大的數。
符合條件的數如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
注意事項
我們可以認為1也是一個丑數
樣例
如果n = 9, 返回 10
挑戰
要求時間復雜度為O(nlogn)或者O(n)
思路
第一個最小數是1,將1乘以2,3,5往PriorityQueue里丟,從PriorityQueue中拋出最小值然后再乘以2,3,5,再加入PriorityQueue和已有元素進行比較,再拋出最小值乘以2,3,5往回丟,如此重復n 次操作;除此之外還需要一個hash表來去重,因為2 * 3 = 6, 而3 * 2也會出現6
注:
集合類型(List,Map,Set)要使用包裝類型
代碼
- O(nlogn) HashMap + Heap
在Java中PriorityQueue會自動把加入其中的數字從小到大排序
class Solution {
/**
* @param n an integer
* @return the nth prime number as description.
*/
public int nthUglyNumber(int n) {
Queue<Long> Q = new PriorityQueue<Long>();
HashSet<Long> inQ = new HashSet<Long>();
Long[] primes = new Long[3];
primes[0] = Long.valueOf(2);
primes[1] = Long.valueOf(3);
primes[2] = Long.valueOf(5);
for (int i = 0; i < 3; i++) {
Q.add(primes[i]);
inQ.add(primes[i]);
}
// 第一個數
Long number = Long.valueOf(1);
for (int i = 1; i < n; i++) {
// 從第二個數開始拋出 n-1 次
number = Q.poll();
for (int j = 0; j < 3; j++) {
if (!inQ.contains(primes[j] * number)) {
Q.add(number * primes[j]);
inQ.add(number * primes[j]);
}
}
}
return number.intValue();
}
}
相關知識點
intValue()的用法
- intValue()是java.lang.Number類的方法,Number是一個抽象類。Java中所有的數值類都繼承它。也就是說,不單是Integer有intValue方法,Double,Long等都有此方法。
- 此方法的意思是:輸出int數據。每個數值類中具體的實現是不同的。例如:
Float類和Double類的intValue方法,就是丟掉了小數位,而Long的intValue方法又不一樣的