leetcode264—丑数原题链接
题意简述
编写一个程序,找出第 n 个丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明:
1, 1 是丑数。
2, n 不超过1690。
解法分析
动态规划
dp[i]:第(i+1)个丑数;
分析可知,后面的一个丑数就是由前面的丑数乘以2,3,5得来的
动态转移方程:
dp[i]=min(dp[index2] * 2,dp[index3] * 3,dp[index5] * 5)
复杂度分析
时间复杂度: O(n);
空间复杂度: O(n);
参考代码
class Solution {
public int nthUglyNumber(int n) {
if(n == 0) return 0;
int[] dp = new int[n];
int index2 = 0;
int index3 = 0;
int index5 = 0;
dp[0] = 1;
for(int i = 1; i < n; i++) {
dp[i] = Math.min(dp[index2] * 2,Math.min(dp[index3] * 3,dp[index5] * 5));
if(dp[i] == dp[index2] * 2) index2++;
if(dp[i] == dp[index3] * 3) index3++;
if(dp[i] == dp[index5] * 5) index5++;
}
return dp[n - 1];
}
}
func nthUglyNumber(n int) int {
if n == 0 {
return 0
}
dp := [1700]int{1}
index2, index3, index5 := 0, 0, 0
for i := 1; i < n; i++ {
dp[i] = min(dp[index2] * 2, dp[index3] * 3, dp[index5] * 5)
if dp[i] == dp[index2] * 2 {
index2++
}
if dp[i] == dp[index3] * 3 {
index3++
}
if dp[i] == dp[index5] * 5 {
index5++
}
}
return dp[n - 1]
}
func min(a int, b int, c int) int {
if a < b {
if a < c {
return a
} else {
return c
}
} else {
if b < c {
return b
} else {
return c
}
}
}