算法的学习笔记—丑数(牛客JZ49)

news2024/10/21 21:59:05

在这里插入图片描述

img

😀前言
在程序设计和算法竞赛中,丑数问题是一个经典的动态规划题目。丑数(Ugly Number)定义为只包含质因子 2、3 和 5 的数。举例来说,数字 6(因子为 2 和 3)、数字 8(因子为 2)都是丑数,而数字 14 不是丑数,因为它包含质因子 7。在这种定义下,1 通常被视为第一个丑数。

🏠个人主页:尘觉主页

文章目录

  • 🥰丑数
    • 😊题目描述
      • 例子
    • 😄解题思路
      • 核心思想
    • 💖代码实现
      • 详解代码
      • 复杂度分析
    • 😄总结

🥰丑数

NowCoder

😊题目描述

把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。

例子

  • 输入:N = 10
  • 输出:12
  • 解释:前10个丑数依次是 [1, 2, 3, 4, 5, 6, 8, 9, 10, 12],因此第10个丑数为12。

😄解题思路

解决该问题的常见方法是动态规划。动态规划的基本思想是从第一个丑数开始,逐步生成下一个丑数,直到得到第 N 个。

核心思想

  1. 定义状态:使用一个长度为 N 的数组 dp,其中 dp[i] 表示从小到大第 i+1 个丑数。初始化 dp[0] = 1,即第一个丑数是 1。
  2. 生成丑数:由于丑数的定义,新的丑数可以通过已知的丑数乘以 2、3 或 5 来生成。因此,我们在每一步都计算下一个可以生成的丑数。
  3. 三个指针:维护三个指针 i2, i3, i5,分别表示当前丑数数组中,乘以 2、3、5 后最小值的索引。每次选择这三个数中的最小值作为下一个丑数,并更新相应的指针。
  4. 避免重复:如果当前生成的丑数等于多个最小值中的某个,我们需要将对应的指针后移,避免重复计算。例如,如果 dp[i] 既是 dp[i2] * 2,又是 dp[i3] * 3,我们需要同时更新 i2i3

💖代码实现

public int GetUglyNumber_Solution(int N) {
    if (N <= 6)
        return N;  // 特殊情况:如果 N 小于等于6,直接返回 N,因为前6个丑数为 [1, 2, 3, 4, 5, 6]
    
    int i2 = 0, i3 = 0, i5 = 0;  // 初始化三个指针,分别指向当前乘以2、3、5的丑数索引
    int[] dp = new int[N];  // 创建数组存储前N个丑数
    dp[0] = 1;  // 第一个丑数是1
    
    for (int i = 1; i < N; i++) {
        // 计算下一个可能的丑数,分别为2、3、5的倍数
        int next2 = dp[i2] * 2, next3 = dp[i3] * 3, next5 = dp[i5] * 5;
        
        // 当前丑数是这三个数中的最小值
        dp[i] = Math.min(next2, Math.min(next3, next5));
        
        // 如果当前最小值是乘以2得到的,更新指针i2
        if (dp[i] == next2)
            i2++;
        // 如果当前最小值是乘以3得到的,更新指针i3
        if (dp[i] == next3)
            i3++;
        // 如果当前最小值是乘以5得到的,更新指针i5
        if (dp[i] == next5)
            i5++;
    }
    
    // 返回第N个丑数
    return dp[N - 1];
}

详解代码

  1. 特殊处理:首先判断 N 是否小于等于 6,因为前 6 个丑数就是 [1, 2, 3, 4, 5, 6],直接返回即可。
  2. 初始化指针和数组i2, i3, i5 分别指向乘以 2、3、5 后可以得到的最小丑数索引。数组 dp 用于存储从小到大生成的丑数,初始值为 dp[0] = 1
  3. 计算最小值:每次循环中,分别计算 next2 = dp[i2] * 2next3 = dp[i3] * 3next5 = dp[i5] * 5,然后取这三个值的最小值作为下一个丑数。
  4. 更新指针:如果当前生成的丑数是乘以 2 得到的,则指针 i2 向后移动,以便下次循环使用更新的丑数;如果是乘以 3 或 5 得到的,也分别移动指针 i3i5

复杂度分析

  • 时间复杂度:O(N),因为我们只需要生成 N 个丑数,每次生成一个丑数的操作时间是常数。
  • 空间复杂度:O(N),因为我们使用了一个长度为 N 的数组来存储丑数。

😄总结

丑数问题通过动态规划的方式,巧妙地利用三个指针生成新的丑数,并且保证了每个丑数都是按顺序生成的。通过这种方式,我们可以在 O(N) 的时间内得到第 N 个丑数,是一种高效的解决方案。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gewechat免费开源微信机器人开发

​聊天机器人&#xff0c;是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上&#xff0c;如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题&#xff0c;以实现降低企业客服运营成本、提升…

珊瑚岛风灵月影四十九项修改器:体力不减/生命不减/开启金钱修改

珊瑚岛是一款以模拟经营岛屿为特色的休闲养成游戏。在游戏中&#xff0c;玩家需设法吸引顾客消费。同时&#xff0c;还需投入时间和资源修复遗址&#xff0c;过程中或会遇到技术、资金及文化保护等挑战&#xff0c;增添游戏趣味与深度。 修改器地址&#xff1a; https://downf…

力扣——链表的中间结点(链表)C语言

题目&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 返回中间3这个结点&#xff1b; 返回中4这个结点&#xff1b; 原理&#xff1a; 思路1&#xff1a;利用遍历链表&#xff0c;统…

图文深入理解java的内存分配

本篇图文深入讨论java的内存分配。当然&#xff0c;这里所说的深入&#xff0c;并不是指长篇大论&#xff0c;而是就事论事重点深入介绍java的内存分配原理机制。 在理解java如何为变量或者对象分配内存之前&#xff0c;我们先来了解一个问题&#xff1a;为什么需要分配内存&am…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑&#xff0c;如何跳过联网激活&#xff1b;由于微软限制必须要联网激活&#xff0c;需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用&#xff0c;Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

今年双十一最值得入手的好物有哪些?双十一值得选购的好物盘点!

在这个全民狂欢的购物盛宴——双十一&#xff0c;每一个角落都弥漫着诱人的优惠与不可错过的精品。从科技潮品到生活必需品&#xff0c;从时尚尖货到家居好物&#xff0c;无数精选商品在这一季集中绽放&#xff0c;等待着慧眼识珠的你将它们带回家&#xff0c;今年的双十一&…

除GOF23种设计模式之简单工厂模式

文章目录 1. 简介2. 代码2.1 抽象类&#xff1a;Course.java2.2 产品A:JavaCourse.java2.3 产品B:PythonCourse.java2.4 工厂:CourseFactory.java2.5 测试&#xff1a;Test.java 3. 心得参考链接&#xff08;无&#xff09; 1. 简介 简单工厂模式(Simple Factory Patern):又称…

Java项目-基于springboot框架的网上书城系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

【番外】软件设计师中级笔记关于数据库技术更新笔记问题

提问 由于软件设计师中级笔记中第九章数据库技术基础的笔记内容太多&#xff0c;我应该分几期发布呢&#xff1f;还是一期一次性发布完成。 如果分为一期发布&#xff0c;可能需要给我多一些时间&#xff0c;由于markdown格式有所差异&#xff0c;所以我需要部分进行修改与调…

策略路由---选路

目录 拓扑图 配置IP 配置静态路由 配置ospf nat 配置路由策略 流分类 流行为 流策略 应用接口 测试流量路径 拓扑图 配置IP [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [R1-GigabitEthernet0/0/0]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add…

Java项目-基于Springboot的车辆充电桩项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

Javascript算法——二分查找

1.数组 1.1二分查找 1.搜索索引 开闭matters&#xff01;&#xff01;&#xff01;[left,right]与[left,right) /*** param {number[]} nums* param {number} target* return {number}*/ var search function(nums, target) {let left0;let rightnums.length-1;//[left,rig…

⌈ 传知代码 ⌋ 无监督动画中关节动画的运动表示

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

PP-ChatOCRv3—文档场景信息抽取v3产线使用教程

文档场景信息抽取v3产线使用教程 1. 文档场景信息抽取v3产线介绍 文档场景信息抽取v3&#xff08;PP-ChatOCRv3&#xff09;是飞桨特色的文档和图像智能分析解决方案&#xff0c;结合了 LLM 和 OCR 技术&#xff0c;一站式解决版面分析、生僻字、多页 pdf、表格、印章识别等常…

Spring连接数据库:Mybatis

MyBatis是一款优秀的框架 在数据库中创建表 1.创建项目mybatis 2.在proxml文件中导入必要配置并进行编译 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33<…

电能表预付费系统-标准传输规范(STS)(15)

6.3.7 CRC: CyclicRedundancyCheck (循环冗余校验) The CRC is a checksum field used to verify the integrity of the data transferred for all tokens, except for Class 0 with SubClass 4 to 7, which uses CRC_C (see 6.3.22). The checksum is derived using the foll…

网络基础知识:交换机关键知识解析

了解交换机的关键知识对网络工程师至关重要。 以下是交换机的基础知识解析&#xff0c;包括其基本概念、工作原理和关键技术点&#xff1a; 01-交换机的基本概念 交换机是一种网络设备&#xff0c;用于在局域网&#xff08;LAN&#xff09;中连接多个设备&#xff0c;如计算机…

如何恢复U盘里格式化数据?别慌,有带图详细步骤!

U盘&#xff0c;这个小巧的存储神器&#xff0c;我们几乎天天都在用。但有时候&#xff0c;一不小心手滑&#xff0c;U盘就被格式化了&#xff0c;里面的东西好像全没了&#xff0c;别急&#xff0c;其实数据恢复没那么难。这篇文章就来告诉你&#xff0c;怎么把格式化的U盘里的…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备云台接入及控制详解

在当今快速发展的信息化时代&#xff0c;视频监控系统已成为企业管理和安全防范的重要工具。随着技术的不断进步&#xff0c;多品牌NVR&#xff08;网络视频录像机&#xff09;管理工具如海康NVR管理平台/工具EasyNVR多个NVR同时管理凭借其强大的兼容性和智能化管理功能&#x…

【LInux】Shell脚本编写基本语法

文章目录 一、前期准备1、查看本机bash2、编辑脚本 二、 判断结构1、if结构2、if/else结构3、if/elif/else结构4、case结构 三、循环结构1、for循环2、while循环3、until循环 四、谢谢观看&#xff01; 一、前期准备 1、查看本机bash which bash之后编写脚本时&#xff0c;第…