面試題49. 醜數
我們把只包含因子 2、3 和 5 的數稱作醜數(Ugly Number)。求按從小到大的順序的第 n 個醜數。
示例:
輸入: n = 10
輸出: 12
解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個醜數
思路
動態規劃!!
byKrahets
醜數的遞推性質: 醜數只包含因子 2, 3, 5 ,因此有 “醜數 == 某較小丑數 × 某因子” (例如:10 = 5×2)。
設已知長度爲 n 的醜數序列 x1, x2, …x_n。
則 Xn+1 = min(Xa * 2, Xb * 3, Xc * 5 ), 其中Xa爲第一個乘以2後大於Xn的數。
由此: 考慮採用三指針, 設置指針a,b,c 指向首個醜數(即 11 ),循環根據遞推公式得到下個醜數,並每輪將對應指針執行 +1 即可。
import java.lang.Math;
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index <= 0) return 0;
int[] dp = new int[index];
dp[0] = 1;
int a = 0, b = 0, c = 0;
for(int i = 1; i < index; i++){
dp[i] = Math.min(Math.min(dp[a]*2, dp[b]*3), dp[c]*5);
if(dp[i] == dp[a] * 2) a++;
if(dp[i] == dp[b] * 3) b++;
if(dp[i] == dp[c] * 5) c++;
}
return dp[index-1];
}
}