LeetCode264. 丑数 II(相关话题:多重指针动态规划)

这篇具有很好参考价值的文章主要介绍了LeetCode264. 丑数 II(相关话题:多重指针动态规划)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数 就是质因子只包含 23 和 5 的正整数。

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 1690

解题思路

  1. 动态规划数组:dp 数组用于存储从第 1 个到第 n 个丑数。dp[0] 初始化为 1,因为第一个丑数定义为 1。
  2. 三个指针:p2、p3、p5 分别表示下一个丑数是当前指向的丑数乘以 2、3 或 5。开始时,这三个指针都指向第一个丑数。
  3. 生成新的丑数:在每一步中,计算 dp[p2] * 2、dp[p3] * 3 和 dp[p5] * 5,并取这三个值中的最小值作为新的丑数。这保证了丑数序列的有序性。
  4. 更新指针:如果当前丑数是由某个指针生成的(即等于该指针对应的乘积),则将该指针后移一位。这样做是为了确保每个指针都能继续参与生成更大的丑数。
  5. 结果:循环结束后,dp[n-1] 存储的是第 n 个丑数。

LeetCode264. 丑数 II(相关话题:多重指针动态规划),# 算法,动态规划,算法

a队列1,2,3,4,5,6,8

b队列1,2,3,4,5

c 队列1,2,3

生成新丑数的过程:在每一步中,代码通过比较 dp[a] * 2dp[b] * 3dp[c] * 5 来决定下一个丑数是哪个。这相当于从三个队列中选出最小的数:文章来源地址https://www.toymoban.com/news/detail-808814.html

  • 一个队列是当前丑数乘以 2 的结果。
  • 另一个队列是当前丑数乘以 3 的结果。
  • 第三个队列是当前丑数乘以 5 的结果。

代码实现 

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        dp = [0] * n  # 初始化DP数组,用于存储丑数
        dp[0] = 1     # 第一个丑数是1

        # 初始化三个指针,分别对应乘以2、3和5的情况
        a, b, c = 0, 0, 0

        for i in range(1, n):
            # 选出当前可以生成的最小丑数
            dp[i] = min(dp[a] * 2, dp[b] * 3, dp[c] * 5)

            # 更新指针,如果当前丑数由某个指针生成,则该指针后移
            if dp[i] == dp[a] * 2: a += 1
            if dp[i] == dp[b] * 3: b += 1
            if dp[i] == dp[c] * 5: c += 1

        return dp[n-1]  # 返回第n个丑数

到了这里,关于LeetCode264. 丑数 II(相关话题:多重指针动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode: 167. 两数之和 II - 输入有序数组 | 双指针专题 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月13日
    浏览(37)
  • leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题

    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 如果链表中存在环 ,则返回 true 。 否则,返回 false 。 思路: 快慢指针问题 。我们可以声明一个 fast 指针(一次走两步),声明一个 slow

    2024年02月12日
    浏览(61)
  • LeetCode213. House Robber II——动态规划

    You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, adjacent houses have a security system connected, and it will automatically contact the police if two adjacent houses w

    2024年02月20日
    浏览(47)
  • leetcode63. 不同路径 II(动态规划-java)

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/unique-paths-ii 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。

    2024年02月11日
    浏览(47)
  • leetcode动态规划(零钱兑换II、组合总和 Ⅳ)

    给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3, coins = [2] 输出: 0 解释: 只用面

    2024年02月01日
    浏览(41)
  • LeetCode算法题解(动态规划)|LeetCoed62. 不同路径、LeetCode63. 不同路径 II

    题目链接:62. 不同路径 题目描述: 一个机器人位于一个  m x n   网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例 1: 示例 2:

    2024年02月05日
    浏览(49)
  • Java 动态规划 Leetcode 213. 打家劫舍 II

    代码展示:         该题其实是Java 动态规划 面试题 17.16. 按摩师的变种,增加了一个首尾是相邻的条件,而我们解决该题也要用到链接的这道题的思想,可以先去看一下上面这篇博客 此题可以采用动态规划的方法进行解决,根据解决动态规划题目的5大步骤进行逐步分析

    2024年02月13日
    浏览(39)
  • (动态规划) 132. 分割回文串 II ——【Leetcode每日一题】

    难度:困难 给你一个字符串 s ,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1: 输入:s = “aab” 输出:1 解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。 示例 2: 输入:s = “a” 输出:0 示例 3: 输入:

    2024年02月15日
    浏览(45)
  • 【LeetCode】丑数题目合辑

    思路 首先,丑数必须是 正整数 ,因此对于 n1 都可以直接返回 false; 对于 n = 1 ,如果 n 能够被 2/3/5 整除,说明它们是丑数。 代码 思路 要得到第 n 个丑数,可以使用 最小堆 实现。 初始化堆为空,首先将最小的丑数 1 加入。每次取出堆顶元素 x ,则 x 是堆中最小的丑数,

    2024年02月13日
    浏览(46)
  • leetcode 动态规划(最后一块石头的重量II、目标和、一和零)

    力扣题目链接(opens new window) 题目难度:中等 有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x = y。那么粉碎的可能结果如下: 如果 x == y,那么两块石头都会被完全粉碎; 如果 x != y,那

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包