劍指 Offer 49. 醜數
阿新 • • 發佈:2021-02-05
劍指 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 12 22 32 42
b++ b=3,dp[3]3
b 3 13 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)