摘要:每次出一個(gè)數(shù),就把這個(gè)數(shù)的結(jié)果都放進(jìn)去。,指針從個(gè)變成個(gè)。的做法參考還是復(fù)雜度的問題,回頭再看看
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分別為上一個(gè)*2, *3, *5得到的丑數(shù),所以當(dāng)前dp[t2]*2, dp[t3]*3, dp[t5]*5分別表示當(dāng)前由*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]; } }
標(biāo)簽還寫了heap,比較明顯的greedy做法,用一個(gè)min heap,top存的是當(dāng)前最小的丑數(shù),poll出n-1個(gè)數(shù),最后top就是第n個(gè)丑數(shù)。每次poll出一個(gè)數(shù),就把這個(gè)數(shù)*2, *3, *5的結(jié)果都放進(jìn)去。這個(gè)復(fù)雜度不太確定,回頭再看看。注意去重,因?yàn)槌?,乘3最后會導(dǎo)致一個(gè)結(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個(gè)變成len(primes)個(gè)。
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/...
還是復(fù)雜度的問題,回頭再看看
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/69877.html
摘要:題目解答這個(gè)問題最主要的就是如果按順序找出那么我們?nèi)绻芟氲桨岩詾橐蜃拥倪@些分成三個(gè)然后在每次輸出時(shí)取里最小的那個(gè)數(shù)輸出就可以解決了。 264 Ugly NumberII題目:Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors only i...
摘要:這題可以使用暴力遍歷法,從開始,對每一個(gè)數(shù)都進(jìn)行判斷,直到找到第個(gè)丑數(shù)為止。優(yōu)先隊(duì)列可以很好的滿足該情況。因此每個(gè)素?cái)?shù)持有的信息包括當(dāng)前對應(yīng)的丑數(shù)的下標(biāo)。 前言 這一篇博客把ugly numbers系列的題目做一個(gè)整理。這三道題正好是一個(gè)思路的循序漸進(jìn),所以放在一篇博客當(dāng)中。 Ugly Number Write a program to check whether a given nu...
摘要:滾動求最大值復(fù)雜度考慮一個(gè),的值是下一個(gè)可能的替補(bǔ)值。思路數(shù)組中保存的是之前保留到的值,因?yàn)橄乱粋€(gè)可能的值是和之前的值的倍數(shù)關(guān)系。 Leetcode[313] Super Ugly Number Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whos...
摘要:題意找出以某些數(shù)為公因數(shù)的遞增排序的第個(gè)數(shù)條件維護(hù)了的元素的相乘因素的。由于是最小值,所以每次保留最小的。問題轉(zhuǎn)化,多次迭代,變成,處理對象變了。不重復(fù)的思想找出重復(fù)計(jì)算的地方,找出不重復(fù)計(jì)算的方法,用極值約束,加以記錄。 題意:找出以某些數(shù)為公因數(shù)的 遞增排序的第n個(gè)數(shù) 條件:indexes 維護(hù)了 primes的元素的相乘因素(uglies)的index。 思路:每次從 prim...
摘要:建兩個(gè)新數(shù)組,一個(gè)存數(shù),一個(gè)存。數(shù)組中所有元素初值都是。實(shí)現(xiàn)的過程是,一個(gè)循環(huán)里包含兩個(gè)子循環(huán)。兩個(gè)子循環(huán)的作用分別是,遍歷數(shù)組與相乘找到最小乘積存入再遍歷一次數(shù)組與的乘積,結(jié)果與相同的,就將加,即跳過這個(gè)結(jié)果相同結(jié)果只存一次。 Problem Write a program to find the nth super ugly number. Super ugly numbers a...
閱讀 3126·2021-11-17 09:33
閱讀 3203·2021-11-16 11:52
閱讀 572·2021-09-26 09:55
閱讀 3049·2019-08-30 15:52
閱讀 1396·2019-08-30 15:44
閱讀 1325·2019-08-30 13:59
閱讀 873·2019-08-30 13:08
閱讀 1242·2019-08-30 10:50