剑指offer(C++)-JZ49:丑数(算法-其他)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

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

数据范围:0≤n≤2000

要求:空间复杂度 O(n) , 时间复杂度 O(n)

示例:

输入:

7

返回值:

8

解题思路:

本题考察算法思维。两种解题思路:

1)优先队列-最小堆

       丑数是含质因子2、3、5的数,从1开始,1乘这三个因数得到的数就是丑数,以此类推,丑数乘因数也是丑数。考虑到这样操作可能会有重复,所以借助map完成去重。再构建优先队列-小顶堆往里面塞入丑数,放入的过程会自动进行排序,排序复杂度在O(log2n)。

       假设获取前n个丑数,就进行n次循环,每次循环将最小的丑数弹出,并放入新的丑数,放入的时候还需要进行重复性判断。

       综合下来,算法时间复杂度为O(nlog2n)。

2)动态规划

       丑数1 2 3 4 5 6 8 9 10等等,每个丑数一定是前面某个数的235倍数,可结合动态规划思想,设置三个步进下标ijk,将已知丑数依次乘235得到后续丑数,在此过程中还需要确保丑数是从小到大放入容器的,即进行最小值比较。

       为了直观些,简单模拟下前面几步的流程:

1)开始ijk均为0,则从数字1开始,丑数后续依次为2 3 5,其中2最小,则i升为1。

2)i为1,即第二个丑数2,用2的2倍也就是4和3 5比较,此时3最小,则j升为1。

3)i和j为1,即用第二个丑数2的2倍3倍,即4和6,和5比较,此时4最小,则i继续升为2。

4)i为2,j为1,k为0,用3的2倍、2的3倍、1的5倍比较,即6 6 4,此时5最小,则k升为1。

5)i为2,j为1,k为1,用3的2倍、2的3倍,2的5倍比较,即6 6 10,此时6最小,i和j同时升1。

       从上述5步可看到全局规律,ijk是从前往后慢慢推进的,结合了动态规划的思想,后续步进以前面为基准,动态扩展后续丑数

       该算法时间复杂度为O(n),也是题目理想解法。

测试代码:

1)优先队列-最小堆

#include <queue>
class Solution {
public:// 获取丑数int GetUglyNumber_Solution(int index) {// 判空if(index == 0){return 0;}// 定义因数集合vector<int> factors = { 2, 3, 5};// 定义哈希表unordered_map<long, bool> um;// 定义优选队列-小顶堆priority_queue<long, vector<long>, greater<>> pq;// 放入1um[long(1)] = true;pq.push(long(1));long result = 0;for(int i = 0; i < index; ++i){// 每次取顶,也就是最小值,弹出result = pq.top();pq.pop();for(int j = 0; j < 3; ++j){// 存入235倍数的值long temp = result * factors[j];// 只存放非重复值if(um.find(temp) == um.end()){um[temp] = true;pq.push(temp);}}}return int(result);}
};

2)动态规划

#include <queue>
class Solution {
public:// 获取丑数int GetUglyNumber_Solution(int index) {// 判空if(index == 0){return 0;}// 定义丑数集合vector<int> uglyNums = { 1 };// 循环按规律找到所有丑数int i = 0, j = 0, k = 0;int t;for(t = 0; t < index; ++t){// ijk表示已知丑数乘235的进度// 举例说明// 1)开始ijk均为0,则从数字1开始,丑数后续依次为2 3 5,其中2最小,则i升为1// 2)i为1,即第二个丑数2,用2的2倍也就是4和3 5比较,此时3最小,则j升为1// 3)i和j为1,即用第二个丑数2的2倍3倍,即4和6,和5比较,此时4最小,则i继续升为2// 4)i为2,j为1,k为0,用3的2倍、2的3倍、1的5倍比较,即6 6 4,此时5最小,则k升为1// 5)i为2,j为1,k为1,用3的2倍、2的3倍,2的5倍比较,即6 6 10,此时6最小,i和j同时升1// 从上述5步可看到全局规律,ijk是从前往后慢慢推进的,结合了动态规划的思想,后续步进以前面为基准,动态扩展后续丑数int num2 = uglyNums[i] * 2;int num3 = uglyNums[j] * 3;int num5 = uglyNums[k] * 5;int minNum = min(num2, min(num3, num5));uglyNums.push_back(minNum);if(minNum == num2){i++;}if(minNum == num3){j++;}if(minNum == num5){k++;}}return uglyNums[t - 1];}
};

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

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

相关文章

【数据库】基于有效性确认的并发访问控制原理及调度流程,乐观无锁模式,冲突较少下的最优模型

使用有效性确认的并发控制 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专…

物流供应链数字化转型:国内领先服务商技术综合解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

TCP/IP详解——IP协议,IP选路

文章目录 1. IP 编址1.1 IP 报文头部1.2 进制之间的转换1.3 网络通信1.4 有类 IP 编制的缺陷1.5 变长子网掩码1.6 网关1.7 IP 包分片1.7.1 IP 包分片实例1.7.2 IP 分片注意事项1.7.3 Wireshark 抓取 IP 包分片1.7.4 OmniPeek 抓取 IP 包分片1.7.5 ICMP 不可达差错&#xff08;需…

【词云图】从excel和从txt文件,绘制以句子、词为单位的词云图

从excel和从txt文件&#xff0c;绘制以句子、词为单位的词云图 写在最前面数据说明&结论 从txt文件&#xff0c;绘制以句子、词为单位的词云图自我介绍 从excel&#xff0c;绘制以句子、词为单位的词云图读取excel绘制以句子、词为单位的词云图文章标题 写在最前面 经常绘…

小程序时代的机遇:开发成功的知识付费平台

知识付费平台不仅为知识创作者提供了广阔的变现渠道&#xff0c;同时也为用户提供了更为个性化、精准的学习体验。本篇文章&#xff0c;小编将为大家讲解知识付费小程序开发相关的知识。 一、小程序时代的背景 知识付费作为小程序领域中的“大热门”&#xff0c;有着非常高的…

一个最小的物联网系统设计方案及源码(一)——系统组成

关于物联网 物联网&#xff08;Internet of Things&#xff0c;缩写IOT&#xff09;是一个基于互联网、传统电信网等信息承载体&#xff0c;让所有能够被独立寻址的普通物理对象实现互联互通的网络。 物联网一般为无线网&#xff0c;由于每个人周围的设备可以达到一千至五千个&…

【unity】【WebRTC】从0开始创建一个Unity远程媒体流app-设置输入设备

【项目源码】 包括本篇需要的脚本都打包在项目源码中,可以通过下面链接下载: 【背景】 目前我们能投射到远端浏览器(或者任何其它Peer)的媒体流只有默认的MainCamera画面,其实我们还可以通过配置输入来传输操作输入信息,比如键鼠等。 【追加input processing组件】 …

GEE:使用网格搜索法(Grid Search)求机器学习的最优参数或者参数组合

作者:CSDN @ _养乐多_ 本文记录了在 Google Earth Engine(GEE)平台中,计算机器学习分类算法最优参数的代码,其中包括单一参数的最优和不同参数组合的最优。使用的最优参数计算方法是网格搜索法(Grid Search),GEE 平台上并没有现成的网格搜索法 API,因此,本文在 GEE …

FPGA学习笔记-1 FPGA原理与开发流程

1 初识FPGA 文章目录 1 初识FPGA1.1 基本认知1.1.1 什么是FPGA&#xff1f;1.1.2 什么是HDL&#xff1f;什么是Verilog&#xff1f;1.1.3 硬件开发与软件开发1.1.4 FPGA与其他硬件的对比1.1.5 FPGA优势与局限性1.1.6 FPGA的应用1.1.7 FPGA的学习之路 1.2 FPGA开发流程1.2.1 一般…

安装Anaconda和pytorch

首先看下自己电脑是否有英伟达的显卡&#xff0c;如果有的话可以安装GPU版本&#xff0c;没有的话可以安装CPU版本。 CPU版本 1.安装Anaconda 首先去官网下载Anaconda。 点击download&#xff0c;下载的就是最新版本的。 下载完成后&#xff0c;直接运行下步就行 注意到路径…

python读取csv文件

在Python中&#xff0c;你可以使用pandas库来读取CSV文件。以下是一个基本的例子&#xff1a; import pandas as pd# 读取CSV文件data pd.read_csv(filename.csv)# 显示前几行数据print(data.head()) 这里&#xff0c;filename.csv应该被替换为你的CSV文件的实际路径和名称。…

Web漏洞分析-文件解析及上传(上)

随着互联网的迅速发展&#xff0c;网络安全问题变得日益复杂&#xff0c;而文件解析及上传漏洞成为攻击者们频繁攻击的热点之一。本文将深入研究文件解析及上传漏洞&#xff0c;通过对文件上传、Web容器IIS、命令执行、Nginx文件解析漏洞以及公猫任意文件上传等方面的细致分析&…

「Verilog学习笔记」简易秒表

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule count_module(input clk,input rst_n,output reg [5:0]second,output reg [5:0]minute);always (posedge clk or negedge rst_n) begin if (~rst…

控制笔记本电脑性能,增强性能/控制发热---Thinkpad x280

1、引言 手上有一台收来办公的Thinkpad x280,但安装的联想管家却没有性能调节选项&#xff0c;导致电脑性能释放很不顺手。由于有室外办公需求&#xff0c;也就有续航需求&#xff0c;也是让它减少发热&#xff1b;同时我想在室内的时候&#xff0c;完整发挥它的性能&#xff…

<Halcon> 局部放大显示

局部放大显示 当读取的图片为超大分辨率时&#xff0c;我们需要对局部位置或定位到的位置在显示窗口放大显示&#xff0c;主要算子为dev_set_part。 read_image (Image, printer_chip/printer_chip_01) gen_rectangle1 (ROI_0, 617.275, 1347.28, 828.349, 1449.5) dev_set_p…

springcloud微服务篇--2.微服务之间的调用

一、微服务案例需求1&#xff1a; 根据订单id查询订单的同时&#xff0c;把订单所属的用户信息一起返回 1、新建订单项目&#xff0c;用户服务。 2.RestTemplate实现微服务之间的访问。 在order-service的OrderApplication中注册RestTemplate 注入调用&#xff1a; Autowire…

Pyhon基于YOLOV实现的车辆品牌及型号检测项目源码+模型+项目文档

项目运行运行录屏&#xff1a; Pyhon基于YOLOV实现的车辆品牌及型号检测项目运行录屏 完整代码下载地址&#xff1a;Pyhon基于YOLOV实现的车辆品牌及型号检测项目 项目背景&#xff1a; 车辆检测及型号识别广泛应用于物业&#xff0c;交通等的管理场景中。通过在停车场出入口…

【PTA刷题+代码+详解】求二叉树度为1的结点个数(递归法)

文章目录 题目C代码详解 题目 在二叉树T中&#xff0c;其度为1的结点是指某结点只有左孩子或只有右孩子。利用递归方法求二叉树T的度为1的结点个数。 1&#xff09;如果TNULL&#xff0c;则是空树&#xff0c;度为1的结点个数为0&#xff0c;返回值为0&#xff1b; 2&#xff0…

上海亚商投顾:沪指收复3000点,房地产板块集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡&#xff0c;创业板指走势较弱&#xff0c;科创50指数跌近1%。房地产板块集体走强&#xff0…

深度学习中的各类评价指标

深度学习中的各类评价指标 1 Dice Loss2 Precision&#xff08;精度&#xff09;3 Recall&#xff08;召回率&#xff09;4 F-Score5 mAP 1 Dice Loss Dice Loss&#xff0c;也叫Soft Dice Coefficient&#xff0c;是一种用于图像分割任务的损失函数。它基于目标分割图像与模型…