【LeetCode】剑指 Offer 49. 丑数 p240 -- Java Version

题目链接:https://leetcode.cn/problems/chou-shu-lcof/

1. 题目介绍(49. 丑数)

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

质因数:质因子(或质因数)在数论里是指能整除给定正整数的质数。根据算术基本定理,不考虑排列顺序的情况下,每个正整数都能够以唯一的方式表示成它的质因数的乘积。
……
在这里插入图片描述

【测试用例】:
示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

【条件约束】:

说明:

  • 1 是丑数。
  • n 不超过1690。

【相关题目】:

注意:本题与主站 264. 丑数 II 题目相同

2. 题解

2.1 枚举 – O(n2)

时间复杂度 O(n^2^): 该算法中有一个while循环,在最坏情况下,需要遍历到第n个丑数才能返回结果。对于每个数,需要判断是否是丑数。判断是否是丑数需要多次除以2、3、5,但每个数只会除以一定数量的2、3、5,因此这个过程的时间复杂度可以看作是O(1)。因此,整个算法的时间复杂度为O(n^2)

空间复杂度O(1):该算法没有使用任何额外空间,只使用了常数级别的额外空间来保存一些变量,因此空间复杂度为O(1)

解题思路】:
逐个判断每个整数是不是丑数。所谓一个数 m 是另外一个数 n 的因子,是指 n 能被 m 整除,也就是 n%m == 0。根据丑数的定义,丑数只能被 2、35 整除。也就是说,如果一个数能被 2 整除,就连续除以 2; 如果能被 3 整除,就连续除以 3;如果能被 5 整除,就连续除以 5。如果最后得到的是 1,那么这个数就是丑数;否则不是。
……
实现策略】:

  1. 定义变量 uglyCount 用来记录当前找到的丑数个数;
  2. 定义方法 isUgly() 用来判断一个数是不是丑数;
  3. 0 开始循环判断当前 i 是不是丑数,直到找到的丑数个数为 n
  4. 返回结果。
class Solution {
    // Solution1:枚举
    public int nthUglyNumber(int n) {
        // 无效输入判断
        if (n <= 0) return 0;
        // 保存找到的丑数个数 
        int uglyCount = 0;
        // 从 0 开始判断丑数
        int i = 0;
        while (uglyCount < n) {
            i++;
            if (isUgly(i)) uglyCount++;
        }
        return i;
    }
    // 判断一个数是否为丑数
    public boolean isUgly(int num) {
        while (num % 2 == 0) num /= 2;
        while (num % 3 == 0) num /= 3;
        while (num % 5 == 0) num /= 5;
        return (num == 1)? true : false;
    }
}

在这里插入图片描述

2.2 动态规划(原书题解思想) – O(n)

时间复杂度O(n),空间复杂度O(n)

解题思路】:
使用 动态规划 思想实现的方法来寻找第 n 个丑数的算法,其中 ugly[i] 表示第 i 个丑数。
……
设已知长度为 n 的丑数序列 x1,x2,…,xn,求第 n +1 个丑数 xn+1。根根据递推性质,丑数 xn+1 只可能是以下三种情况其中之一 (索引 a,b,c 为未知数) :
在这里插入图片描述
即,要么是乘 2 得到的,要么就是乘 3 得到的,否则就是乘 5 得到的
……
递推公式:
在这里插入图片描述
通过递归公式,不断往上递推下一个丑数值,并每次选出可能的最小值存入,间接的相当于进行了排序。
……
通过定义三个变量作为索引,表示指示递推丑数的下一个可能值(3选1,在里面选最小):在这里插入图片描述
……
索引变化规律:
在这里插入图片描述

class Solution {
    // Solution2:动态规划
    public int nthUglyNumber(int n) {
        // 无效输入判断
        if (n <= 0) return 0;
        // 初始化丑数数组
        int[] ugly = new int[n];
        ugly[0] = 1;
        // 定义三个指针,表示下一个丑数是该指针指向的丑数*2、*3或*5得到的
        int i2 = 0, i3 = 0, i5 = 0;
        // 循环计算丑数
        for (int i = 1; i < n; i++) {
            // 计算下一个丑数
            ugly[i] = Math.min(ugly[i2] * 2, Math.min(ugly[i3] * 3, ugly[i5] * 5));
            // 更新指针
            if (ugly[i] == ugly[i2] * 2) i2++;
            if (ugly[i] == ugly[i3] * 3) i3++;
            if (ugly[i] == ugly[i5] * 5) i5++;
        }
        return ugly[n - 1];
    }
}

在这里插入图片描述

3. 参考资料

[1] 剑指 Offer 49. 丑数(动态规划,清晰图解)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 基础入门速成上篇

JavaScript 嵌入页面的方式 1. 行间事件 <button onclick"alert(点击按钮)">按钮</button> 2. script标签 <script type"text/javascript">console.log(Hello javascript !) </script> 3. 外部引入 <script type"t…

IO流复习

目录字符集git pull origin master --allow-unrelated-historiesCTRL ALT T进行整块代码的操作&#xff08;会出现一个选项栏&#xff09;字符集的编码和解码操作IO流字节输入流和字节输出流文件拷贝资源释放的方式字符输入流和字符输出流缓冲流字节缓冲流的性能分析字符缓冲流…

算法题:图的表示形式与遍历框架

图的基本概念 在数据结构和算法上&#xff0c;图的数据表示一般使用邻接表和邻接矩阵的形式。 比如&#xff1a; 邻接表和邻接矩阵存储如下。邻接表是用vector[vector[i]] 存储每个节点指向的节点&#xff0c;邻接矩阵是用一个二维矩阵matrix[i][j]表示&#xff0c;如果第数据…

小米手机root后过软件检测

工具&#xff1a; https://wwp.lanzouf.com/b0cybm3ib 密码: 9hn8 视频讲解&#xff1a;隐藏root终极教程&#xff08;2022年&#xff09; 演示机型&#xff1a;小米10&#xff0c;安卓14&#xff0c;MIUI14.0.2 问题描述 安装magisk后使用病毒扫描发现支付环…

Flink (十) --------- 容错机制

目录一、 检查点&#xff08;Checkpoint&#xff09;1. 检查点的保存2. 从检查点恢复状态3. 检查点算法4. 检查点配置5. 保存点&#xff08;Savepoint&#xff09;二、状态一致性1. 一致性的概念和级别2. 端到端的状态一致性三、端到端精确一次&#xff08;end-to-end exactly-…

ActiveMQ使用(二):在JavaScript中使用mqtt.js

ActiveMQ使用(二):在JavaScript中使用mqtt.js 1. 环境准备 jQuery-1.10 下载地址:https://www.jsdelivr.com/package/npm/jquery-1.10.2?tabfilesmqtt.js 4.3.7: 下载地址:https://www.jsdelivr.com/package/npm/mqtt 2. 相关代码 <!DOCTYPE html> <html lang&q…

和开振学Spring boot 3.0之Spring MVC:④获取参数(上)

之前&#xff0c;我反复说过处理器封装了控制器&#xff0c;HandlerMapping的机制找到处理器后&#xff0c;通过处理器就能运行控制器&#xff0c;那么处理器增强了控制器什么功能呢&#xff1f; 我们用脑子想一下&#xff0c;要运行控制器之前&#xff0c;我们需要做什么&…

《Java8实战》第1章 Java 8、9、10 以及 11 的变化

如想了解 Oracle 公司对 JDK 的最新支持情况&#xff0c;请访问https://www.oracle.com/technetwork/java/java-se-supportroadmap.html。所有的示例代码均可见于图灵社区本书主页 http://ituring.com.cn/book/2659“随书下载”处。 1.1 为什么要关心 Java 的变化 Java8做的…

小程序的组件化开发

目录&#xff1a; 1 小程序组件化思想 2 自定义组件的过程 3 组件样式实现细节 4 组件使用过程通信 5 组件插槽定义使用 6 Component构造器 在小程序里面需要创建组件的话需要在最外层建component包&#xff0c;然后在使用新建component来创建类似page的4个文件&#xff…

Spark 简介与原理

目录标题1 Spark 简介与原理1.1 Spark与Hadoop的区别1.2 Spark的应用场景1.3 Spark的作业运行流程1.4 Spark 2.X与Spark 1.X的区别1 Spark 简介与原理 Spark 是一个大规模数据处理的统一分析引擎。 具有迅速、通用、易用、支持多种资源管理器的特点。 Spark生态系统: Spark SQL…

C++之AVL树

文章目录前言一、概念二、AVL树结点的定义三、AVL树的插入四、AVL树的旋转1.右单旋的情况以及具体操作抽象图h 0h 1h 2代码实现2.左单旋的情况以及具体操作抽象图代码实现3.右左双旋的情况以及具体操作抽象图h 0h 1h 23.左右双旋的情况以及具体操作抽象图5.总结6.完整实现…

stable-diffusion-webui浅叙

GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 使用Git下载&#xff1a; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 运行 webui-user.bat : git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.g…

Python每日一练(20230413)

目录 1. 最后一个单词的长度 ※ 2. 全排列 &#x1f31f;&#x1f31f; 3. 计数质数 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 最后一个单词的长度 给你一个字符串 s&…

sql server 入门教程

sql server 入门教程 1、创建数据库 1&#xff09;鼠标右键数据库选项&#xff0c;点击新建数据库 2&#xff09;命名数据库 根据自己业务情况取一个自定义数据库名字&#xff0c;比如&#xff1a;my_database 3&#xff09;查看数据库 如果添加没看到&#xff0c;那么可鼠…

知识图谱:Neo4j数据库的基本使用——创建张学良的关系谱

一、知识图谱及Neo4j数据库介绍 知识图谱&#xff08;Knowledge Graph&#xff09;是人工智能的重要分支技术&#xff0c;它在2012年由谷歌提出&#xff0c;是结构化的语义知识库&#xff0c;用于以符号形式描述物理世界中的概念及其相互关系&#xff0c;其基本组成单位是“实体…

安全防御第四天:防病毒网关

一、恶意软件1.按照传播方式分类&#xff08;1&#xff09;病毒病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0c;又是下一次感染的出发点…

基于目标级联法的微网群多主体分布式优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

花了近三周时间对 ChatGPT 进行多方面了解、体验后写的报告,超级全面,建议想了解的朋友看看

优质介绍视频&#xff1a; GPT4前端【AI编程新纪元】 【渐构】万字科普GPT4为何会颠覆现有工作流&#xff1b;为何你要关注微软Copilot、文心一言等大模型 ChatGPT 是什么&#xff1a;ChatGPT最初是2022年11月30日由OpenAI开发并推出的聊天机器人&#xff0c;是基于 GPT-3.5 …

Spring 源码分析(二)——GenericBeanDefinition 分析

BeanDefinition 中存储着 Bean 的定义信息&#xff0c;它具有属性值、构造函数参数值以及具体实现 Bean 提供的进一步信息&#xff0c;在学习 Spring 的 Bean 初始化流程之前&#xff0c;还是非常有必要先了解一下 BeanDefinition。 一、注册 Bean 示例 首先&#xff0c;本文…

SQL Server的日志传送

日志传送和复制一、前言二、相关术语和定义三、日志传送和复制3.1、在主数据库丢失时从辅助数据库进行复制的要求和过程3.2、使用事务复制进行日志传送3.3、使用合并复制进行日志传送一、前言 日志传送允许您自动将事务日志备份从主服务器实例上的主数据库发送到单独辅助服务器…
最新文章