1. 程式人生 > 其它 >劍指 Offer 49. 醜數

劍指 Offer 49. 醜數

技術標籤:java演算法動態規劃

劍指 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。
注意:本題與主站 264 題相同:https://leetcode-cn.com/problems/ugly-number-ii/

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/chou-shu-lcof

著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

思路

三路歸併
a=b=c=1,dp[a]=dp[b]=dp[c] = 1,
dp[i] = min(dp[a]2, dp[b]3, dp[c]5),dp[i]為一個醜數乘上2或3或5才為醜數,否則不是
dp[2]2
a++ a++ a++
a 2 1
2 2
2 3
2 4
2
b++ b=3,dp[3]3
b 3 1
3 23 33
c=1
c 5 1*5

程式碼

// class Solution {
//     public int nthUglyNumber(int n) {
//         int[] dp = new int[1691];
// dp[1] = 1; // Set<Integer> set = new HashSet<>(); // set.add(1); // for(int i = 2; i <= n; ++i) { // int pre = dp[i - 1]; // int j = 0; // while(true) { // pre += 1; // if(pre % 2 == 0 && set.contains(pre / 2) || pre % 3 == 0 && set.contains(pre / 3) || pre % 5 == 0 && set.contains(pre / 5)) {
// dp[i] = pre; // set.add(pre); // break; // } // } // } // return dp[n]; // } // } //優化 class Solution { public int nthUglyNumber(int n) { int[] dp = new int[1691]; dp[0] = 1; int i = 1, a = 0, b = 0, c = 0; while(i < n) { int t1 = dp[a] * 2, t2 = dp[b] * 3, t3 = dp[c] * 5; dp[i] = Math.min(t1, t2); dp[i] = Math.min(dp[i], t3); // System.out.println(dp[i]); if(dp[i] == t1) { a++; } if(dp[i] == t2) { b++; } if(dp[i] == t3) { c++; } i++; } return dp[n - 1]; } }

複雜度

時間:O(n)、
空間O(n)