劍指offer第49題 醜數
問題描述:
我們把只包含質因子 2、3 和 5 的數稱作醜數(Ugly Number)。求按從小到大的順序的第 n 個醜數。
示例:
輸入: n = 10
輸出: 12
解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個醜數。
說明:
- 1 是醜數。
- n 不超過1690。
解題思路:
醜數的遞推性質:醜數只包含因子2,3,5,因此有“醜數=某較小丑數×某因子”(例如:10=5×2)。所以我們可以使用三個因子分別乘以較小的醜數,然後選出最小值即可不斷遞推出第n個醜數。注意需要將對應的下標移動。
參考文章:
醜數
程式碼實現:
public int nthUglyNumber(int n) {
int[] dp = new int[n];
int a=0; //表示首個乘以2後大於第i個醜數的位置
int b=0; //表示首個乘以3後大於第i個醜數的位置
int c=0; //表示首個乘以5後大於第i個醜數的位置
dp[0] = 1; //初始化
for(int i=1; i<dp.length; i++) {
int n2 = dp[a]*2;
int n3 = dp[b]*3;
int n5 = dp[c]*5;
dp[i] = Math.min(Math.min(n2, n3), n5); //選出最小值
if(dp[i]==n2) a++;
if(dp[i]==n3) b++;
if(dp[i]==n5) c++;
}
return dp[n-1];
}
提交結果:
相關文章
- LeetCode|劍指 Offer 49.醜數LeetCode
- 劍指offer—49.醜數—分析及程式碼(Java)Java
- 劍指offer第41~50題
- 劍指offer-第2章
- 劍指Offer題解合集
- 劍指offer刷題記錄
- 劍指OFFER
- 劍指offer——連結串列中倒數第k個結點
- 劍指Offer 表示數值的字串字串
- 劍指offer刷題day02
- 劍指offer——斐波那契數列
- LeetCode-劍指Offer刷題記錄LeetCode
- 《劍指offer》JAVA題解,LeetCode評測JavaLeetCode
- 劍指offer導航
- Leetcode劍指offer(八)LeetCode
- 劍指offer16
- 劍指 offer20
- 劍指 offer21
- 劍指Offer系列之「表示數值的字串」字串
- 劍指Offer-31-最小的K個數
- 劍指Offer系列刷題筆記彙總筆記
- 【劍指offer】讓抽象問題具體化抽象
- 劍指offer(java實現)第4題“重建二叉樹”-牛客網Java二叉樹
- 【leetcode】劍指 Offer 16. 數值的整數次方LeetCode
- 【劍指Offer】矩形覆蓋
- 劍指offer——跳臺階
- 六、劍指 Offer(25~29)
- 劍指offer-JavaScript版JavaScript
- 力扣 - 劍指 Offer 22. 連結串列中倒數第k個節點力扣
- Leetcode 劍指 Offer 40. 最小的k個數LeetCode
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 「劍指offer」27道Mybatis面試題含解析MyBatis面試題
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- ✏️ JavaScript版 | 10大專題 | 劍指offer刷題筆記 ✏️JavaScript筆記
- 劍指 offer(1) -- 陣列篇陣列
- 【劍指offer】【2】字串的空格字串
- 劍指offer-9-斐波那契數列-javaJava