丑数 动态规划 找规律

题目描述:
给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

示例 1:

输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例 2:

输入:n = 1
输出:1
解释:1 通常被视为丑数。

解答:
1.证明新的丑数必可以通过旧的丑数列表中的数乘2或3或5生成。
2.如何确保生成的下一个丑数一定是最小的
3.设置3个指针p2,p3,p5,开始时都为0,dp[0]=1,dp[i]=min(dp[p2]2,dp[p3]3,dp[p5]*5),若dp[i]由p2指针生成,则p2指针右移一格。
4.有时候严格的证明是很困难的,但是凭经验或者直觉得到的猜想,经过手写模拟没有发现错误,那么就可以初步证明这个猜想没问题。

class Solution {
    public int nthUglyNumber(int n) {
        int p2=0;
        int p3=0;
        int p5=0;
        int[] nums=new int[n];
        nums[0]=1;
        for(int i=1;i<n;i++){
            int min_p2=nums[p2]*2;
            int min_p3=nums[p3]*3;
            int min_p5=nums[p5]*5;
            if(min_p2<=min_p3&&min_p2<=min_p5){
                nums[i]=min_p2;
                p2++;
            }
            if(min_p3<=min_p2&&min_p3<=min_p5){
                nums[i]=min_p3;
                p3++;
            }
            if(min_p5<=min_p2&&min_p5<=min_p3){
                nums[i]=min_p5;
                p5++;
            }
        }
        return nums[n-1];
    }
}
posted @ 2022-04-27 14:07  无极是一种信仰  阅读(74)  评论(0)    收藏  举报