劍指49_醜數(java)

面試題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];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章