醜數——最小堆;動態規劃
阿新 • • 發佈:2022-05-31
醜數
描述
如果一個數只有質數因子2
,3
,5
,那麼這個數是一個醜數。我們可以認為 1
也是一個醜數。
樣例
輸入:9
輸出:10
題解1: 動態規劃
class Solution { public int nthUglyNumber(int n) { int a = 2, b = 3, c = 5; int[] dp = new int[n]; int aa = 0, bb =0, cc=0, res; dp[0]=1; for (int i = 1; i < n; i++) { dp[i] = Math.min(dp[aa] * a, Math.min(dp[bb]*b, dp[cc]* c)); if(dp[i] == dp[aa]*a) aa++; if(dp[i] == dp[bb]*b) bb++; if(dp[i] == dp[cc]*c) cc++; } return dp[n-1]; } }
題解2: 堆+Set
PriorityQueue: 最小堆,每次可以取出堆中當前的最小丑數
Set:檢測醜數是否存在,不存在將醜數放到堆中
時間複雜度:每取出一個數,就會加入3個數,時間複雜度約等於O(3nlog(3n))
public int nthUglyNumber(int n) { PriorityQueue<Long> queue = new PriorityQueue<>(); Set<Long> set = new HashSet<>(); int[] factors = new int[]{2, 3, 5}; queue.add(1L); set.add(1L); long min; for (int i = 2; i <= n; i++) { min = queue.poll(); for (int factor : factors) { if(!set.contains(min* factor)) { queue.add(min * factor); set.add(min * factor); } } } min = queue.poll(); return (int) min; }