动态规划ing-丑数 II|Java 刷题打卡

321 阅读3分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看<活动链接>

【Java 刷题打卡 】刷题比玩游戏好多了,成就感越来越强,每天坚持刷几道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

那就干吧! 这个专栏都是刷的题目都是关于动态规划的,我会由浅入深、循序渐进,刷题就是这样需要连续不断的记忆--艾宾浩斯记忆法2121112。动态规划的内容不多,但是都是每个程序员必备的

这是一道比较简单的题目😄😄😄 \color{green}{这是一道比较简单的题目😄 😄 😄 ~}

什么题可以选择动态规划来做?

1.计数

  • 有多少种方式走到右下角
  • 有多少种方法选出k个数是的和是sum

2.求最大值最小值

  • 从左上角走到右下角路径的最大数字和
  • 最长上升子序列长度

3.求存在性

  • 取石子游戏,先手是否必胜
  • 能不能选出k个数使得和是sum

4.综合运用

  • 动态规划 + hash
  • 动态规划 + 递归
  • ...

leecode 264. 丑数 II

给你一个整数 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 <= n <= 1690


--

❤️❤️❤️❤️

2.1. 动态规划组成部分1:确定状态

简单的说,解动态规划的时候需要开一个数组,数组的每个元素f[i]或者f[i][j]代表什么,类似数学题中x, y, z代表什么

最后一步

很明显,定义d[n], 为第 n 个 丑数的值

这道题和最小硬币题目很类似。简单说一下,丑数就是2x、3x、5x的倍数,题目说1也算丑数。

从2 到 n 的最小 (2x、3y、5z的倍数)的值,由于动态规划保存了之前的值,因此最后一个值是2x、3y、5z的倍数中最小的值。

x、y、z有什么联系呢?首先是递增的,第一次出现为1,第二次出现为2,例如4 = 22,但是4并不是最小的,3 = 13才是

1.2. 动态规划组成部分2:转移方程

dp[n] = min{ 2d[2x], 3d[3y], 5*d[5z] }

1.3. 动态规划组成部分3:初始条件和边界情况

d[1] = 1

1.4. 动态规划组成部分4:计算顺序

依次计算。

棒!😄😄😄 \color{green}{棒!😄 😄 😄 ~}

参考代码

NICE太简单啦😄😄😄 \color{red}{NICE太简单啦😄 😄 😄 ~}

java版

class Solution {
    public int nthUglyNumber(int n) {
        int[] dp = new int[n + 1];
        dp[1] = 1;
        int p2 = 1, p3 = 1, p5 = 1;
        for (int i = 2; i <= n; i++) {
            int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;
            dp[i] = Math.min(Math.min(num2, num3), num5);
            if (dp[i] == num2) {
                p2++;
            }
            if (dp[i] == num3) {
                p3++;
            }
            if (dp[i] == num5) {
                p5++;
            }
        }
        return dp[n];
    }
}


真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️