剑指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.hqwc.cn/news/268050.html

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

相关文章

Shell函数数组练习

1、编写函数&#xff0c;实现打印绿色OK和红色FAILED&#xff0c;判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED [rootshell ~]# vim ok.sh #!/bin/bash read -p "请输入一个参数:" i function ok…

DNF 单机联网 搭建教程(附视频)

更多游戏搭建&pvf修改教程请见: DNF教程 注意&#xff1a;请不要将游戏进行商业化&#xff0c;一切后果概不负责。仅供单机&#xff0c;好友之间进行娱乐&#xff01;&#xff01; 注意&#xff1a;请不要将游戏进行商业化&#xff0c;一切后果概不负责。仅供单机&#…

SiteGround如何设置WordPress网站自动更新

SiteGround Autoupdate功能会自动帮我们更新在他们这里托管的所有WordPress网站&#xff0c;这样做是为了保证网站安全&#xff0c;并且让它们一直保持最新状态。他们会根据我们选择的设置自动更新不同版本的WordPress&#xff0c;包括主要版本和次要版本。在每次自动更新之前&…

计算机循环神经网络(RNN)

计算机循环神经网络&#xff08;RNN&#xff09; 一、引言 循环神经网络&#xff08;RNN&#xff09;是一种常见的深度学习模型&#xff0c;适用于处理序列数据&#xff0c;如文本、语音、时间序列等。RNN通过捕捉序列数据中的时间依赖关系和上下文信息&#xff0c;能够解决很…

EasyRecovery2024国内免费的电脑数据恢复软件(一键备份还原)

EasyRecovery2024是coco玛奇朵Ontrack 的技术杰作。它是一个硬盘数据恢复工具&#xff0c;能够帮你恢复丢失的数据以及重建文件系统。其 Professioanl &#xff08;专业&#xff09; 版更是囊括了磁盘诊断、数据恢复、文件修复、E-mail 修复等全部 4 大类目19 个项目的各种数据…

npm,yarn,pnpm包管理器的介绍

npm&#xff0c;yarn和pnpm都是我们通常使用的包管理器&#xff0c;具体有什么区别呢&#xff1f;别的也不细说&#xff0c;就是快&#xff01;更节省磁盘空间。yarn比npm好&#xff0c;pnpm比yarn好&#xff01;

智慧机房与3D机房动环监控系统的应用

智慧机房是什么&#xff1f; 智慧机房是集采集信息、实时监控、数据分析、统一管理、故障告警等功能于一体的全方位、立体化的智能环境监控系统&#xff0c;构建物联网、大数据和云计算背景下现代企业的“数据心脏”。它能为机房管理者呈现细致入微的关键性数据&#xff0c;优…

多线程 - 学习笔记

前置知识 什么是线程和进程? 进程: 是程序的一次执行,一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间&#xff0c;一个进程可以有多个线程&#xff0c;比如在Windows系统中&#xff0c;一个运行的xx.exe就是一个进程。 线程: 进程中的一个执行流&#xff0…

Knowledge Graph知识图谱—8. Web Ontology Language (OWL)

8. Web Ontology Language (OWL) 在RDFs不可能实现&#xff1a; Property cardinalities, Functional properties, Class disjointness, we cannot produce contradictions, circumvent the Non Unique Naming Assumption, circumvent the Open World Assumption 8.1 OWL Tr…

BGR2RGB

numpy读取的时候进行img[&#xff1a;&#xff0c;&#xff1a;&#xff0c;&#xff1a;&#xff1a;-1]这个操作就可以进行BGR转RGB的操作&#xff08;读入是BGR, 否则就是RGB2BGR&#xff09;&#xff0c;这个不知道的话&#xff0c;穿越门写的非常清晰&#xff1a; https:/…

数据结构:栈(Stack)的各种操作(入栈,出栈,判断栈非空,判断栈已满,附源码)

前言&#xff1a;在前面的文章中&#xff0c;我们讲解了顺序表&#xff0c;单链表&#xff0c;双向链表。而我们今天要分享的栈则是基于之前的数据结构上搭建的&#xff0c;但是相较于顺序表和链表来说&#xff0c;栈的实现就非常简单了。 目录 一.栈(Stack)的概念 二.栈的数…

mysql数据恢复

使用MySQL第三方工具binlog2sql binlog2sql&#xff0c;一款基于python开发的开源工具&#xff0c;是由大众点评团队的DBA使用python开发出来的&#xff0c;从MySQL binlog解析出你要的SQL。根据不同选项&#xff0c;你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。其功…