摘要:每次出一个数,就把这个数的结果都放进去。,指针从个变成个。的做法参考还是复杂度的问题,回头再看看
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得到的丑数,所以当前dp[t2]*2, dp[t3]*3, dp[t5]*5分别表示当前由*2, *3, *5得到的最小丑数
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存的是当前最小的丑数,poll出n-1个数,最后top就是第n个丑数。每次poll出一个数,就把这个数*2, *3, *5的结果都放进去。这个复杂度不太确定,回头再看看。注意去重,因为乘2,乘3最后会导致一个结果出现多次,还有最后存的结果可能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数组里的数。
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/...
还是复杂度的问题,回头再看看
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/69877.html
摘要:题目解答这个问题最主要的就是如果按顺序找出那么我们如果能想到把以为因子的这些分成三个然后在每次输出时取里最小的那个数输出就可以解决了。 264 Ugly NumberII题目:Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors only i...
摘要:这题可以使用暴力遍历法,从开始,对每一个数都进行判断,直到找到第个丑数为止。优先队列可以很好的满足该情况。因此每个素数持有的信息包括当前对应的丑数的下标。 前言 这一篇博客把ugly numbers系列的题目做一个整理。这三道题正好是一个思路的循序渐进,所以放在一篇博客当中。 Ugly Number Write a program to check whether a given nu...
摘要:滚动求最大值复杂度考虑一个,的值是下一个可能的替补值。思路数组中保存的是之前保留到的值,因为下一个可能的值是和之前的值的倍数关系。 Leetcode[313] Super Ugly Number Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whos...
摘要:题意找出以某些数为公因数的递增排序的第个数条件维护了的元素的相乘因素的。由于是最小值,所以每次保留最小的。问题转化,多次迭代,变成,处理对象变了。不重复的思想找出重复计算的地方,找出不重复计算的方法,用极值约束,加以记录。 题意:找出以某些数为公因数的 递增排序的第n个数 条件:indexes 维护了 primes的元素的相乘因素(uglies)的index。 思路:每次从 prim...
摘要:建两个新数组,一个存数,一个存。数组中所有元素初值都是。实现的过程是,一个循环里包含两个子循环。两个子循环的作用分别是,遍历数组与相乘找到最小乘积存入再遍历一次数组与的乘积,结果与相同的,就将加,即跳过这个结果相同结果只存一次。 Problem Write a program to find the nth super ugly number. Super ugly numbers a...
阅读 2937·2021-11-17 09:33
阅读 3086·2021-11-16 11:52
阅读 465·2021-09-26 09:55
阅读 2883·2019-08-30 15:52
阅读 1272·2019-08-30 15:44
阅读 1239·2019-08-30 13:59
阅读 752·2019-08-30 13:08
阅读 1093·2019-08-30 10:50