摘要:每次出一個數(shù),就把這個數(shù)的結(jié)果都放進去。,指針從個變成個。的做法參考還是復雜度的問題,回頭再看看
264. Ugly Number II
題目鏈接:https://leetcode.com/problems...
dp的方法參考discussion:
https://discuss.leetcode.com/...
dp的subproblem是:dp[i]: i-th ugly number
dp的function是:dp[i] = min(dp[t2] * 2, dp[t3] * 3, dp[t5] * 5)
其中,t2-1, t3-1, t5-1分別為上一個*2, *3, *5得到的丑數(shù),所以當前dp[t2]*2, dp[t3]*3, dp[t5]*5分別表示當前由*2, *3, *5得到的最小丑數(shù)
public class Solution { public int nthUglyNumber(int n) { if(n == 0) return 0; if(n == 1) return 1; int[] dp = new int[n]; dp[0] = 1; int t2 = 0, t3 = 0, t5 = 0; for(int i = 1; i < n; i++) { dp[i] = Math.min(Math.min(dp[t2]*2, dp[t3]*3), dp[t5]*5); if(dp[i] == dp[t2]*2) t2++; if(dp[i] == dp[t3]*3) t3++; if(dp[i] == dp[t5]*5) t5++; } return dp[n-1]; } }
標簽還寫了heap,比較明顯的greedy做法,用一個min heap,top存的是當前最小的丑數(shù),poll出n-1個數(shù),最后top就是第n個丑數(shù)。每次poll出一個數(shù),就把這個數(shù)*2, *3, *5的結(jié)果都放進去。這個復雜度不太確定,回頭再看看。注意去重,因為乘2,乘3最后會導致一個結(jié)果出現(xiàn)多次,還有最后存的結(jié)果可能overflow,所以用long來處理,參考discussion:
https://discuss.leetcode.com/...
public class Solution { public int nthUglyNumber(int n) { if(n == 0) return 0; if(n == 1) return 1; PriorityQueue313. Super Ugly NumberminHeap = new PriorityQueue(); minHeap.offer(1L); for(int i = 1; i < n; i++) { long cur = minHeap.poll(); // remove duplication while(!minHeap.isEmpty() && minHeap.peek() == cur) minHeap.poll(); minHeap.add(cur*2); minHeap.add(cur*3); minHeap.add(cur*5); } return minHeap.poll().intValue(); } }
題目鏈接:https://leetcode.com/problems...
和上一題的方法是一樣的,只不過這里把2,3,5變成了給的primes數(shù)組里的數(shù)。
dp,index指針從3個變成len(primes)個。
public class Solution { public int nthSuperUglyNumber(int n, int[] primes) { if(n == 0) return 0; if(n == 1) return 1; // dp[i]: i-th ugly number int[] dp = new int[n]; int m = primes.length; // index[i]: ugly number producted by primes[i] int[] index = new int[m]; dp[0] = 1; for(int i = 1; i < n; i++) { dp[i] = Integer.MAX_VALUE; for(int j = 0; j < m; j++) dp[i] = Math.min(dp[i], primes[j]*dp[index[j]]); // update index points for(int j = 0; j < m; j++) { if(dp[i] == dp[index[j]] * primes[j]) index[j]++; } } return dp[n-1]; } }
heap+dp的做法參考discussion:
https://discuss.leetcode.com/...
還是復雜度的問題,回頭再看看
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69877.html
摘要:題目解答這個問題最主要的就是如果按順序找出那么我們?nèi)绻芟氲桨岩詾橐蜃拥倪@些分成三個然后在每次輸出時取里最小的那個數(shù)輸出就可以解決了。 264 Ugly NumberII題目:Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors only i...
摘要:這題可以使用暴力遍歷法,從開始,對每一個數(shù)都進行判斷,直到找到第個丑數(shù)為止。優(yōu)先隊列可以很好的滿足該情況。因此每個素數(shù)持有的信息包括當前對應的丑數(shù)的下標。 前言 這一篇博客把ugly numbers系列的題目做一個整理。這三道題正好是一個思路的循序漸進,所以放在一篇博客當中。 Ugly Number Write a program to check whether a given nu...
摘要:滾動求最大值復雜度考慮一個,的值是下一個可能的替補值。思路數(shù)組中保存的是之前保留到的值,因為下一個可能的值是和之前的值的倍數(shù)關系。 Leetcode[313] Super Ugly Number Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whos...
摘要:題意找出以某些數(shù)為公因數(shù)的遞增排序的第個數(shù)條件維護了的元素的相乘因素的。由于是最小值,所以每次保留最小的。問題轉(zhuǎn)化,多次迭代,變成,處理對象變了。不重復的思想找出重復計算的地方,找出不重復計算的方法,用極值約束,加以記錄。 題意:找出以某些數(shù)為公因數(shù)的 遞增排序的第n個數(shù) 條件:indexes 維護了 primes的元素的相乘因素(uglies)的index。 思路:每次從 prim...
摘要:建兩個新數(shù)組,一個存數(shù),一個存。數(shù)組中所有元素初值都是。實現(xiàn)的過程是,一個循環(huán)里包含兩個子循環(huán)。兩個子循環(huán)的作用分別是,遍歷數(shù)組與相乘找到最小乘積存入再遍歷一次數(shù)組與的乘積,結(jié)果與相同的,就將加,即跳過這個結(jié)果相同結(jié)果只存一次。 Problem Write a program to find the nth super ugly number. Super ugly numbers a...
閱讀 2966·2021-11-17 09:33
閱讀 3127·2021-11-16 11:52
閱讀 491·2021-09-26 09:55
閱讀 2987·2019-08-30 15:52
閱讀 1324·2019-08-30 15:44
閱讀 1270·2019-08-30 13:59
閱讀 806·2019-08-30 13:08
閱讀 1168·2019-08-30 10:50