【每日算法Day 81】面试经典题:关于丑数,你真的理解为什么这么算吗?

简介: 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。

题目链接


LeetCode 面试题 17.09. 第 k 个数[1]

题目描述


有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。

示例1

输入:k = 5输出:9

题解


这题和主站的LeetCode 264. 丑数 II是一个意思:

https://leetcode-cn.com/problems/ugly-number-ii/

最直观的想法就是,假设已经生成了 N个丑数,那么我们把每个丑数都乘上 3,5,7,得到的结果中大于已经生成的所有丑数并且最小的那个就是下一个丑数。

但是这样会产生很多重复的丑数,所以也可以用一个优先队列,将已经生成的丑数从小到大保存下来。然后取出队首最小的那个丑数,给它乘上 3,5,7,将新的三个数入队,并且队首的这个数出队,这样就不会再产生重复的数了。

上面这种方法已经可以过这道题了,但是还有更简单的方法。


image.png

这么做为什么是对的呢?我们将  数组写成三行相同的形式:

image.png


image.png


c++

classSolution {
public: 
intgetKthMagicNumber(intk) {  
vector<int>res(k, 1);     
intidx3=0, idx5=0, idx7=0;  
for (inti=1; i<k; ++i) {  
res[i] =min(res[idx3]*3, min(res[idx5]*5, 
res[idx7]*7));   
if (res[i] ==res[idx3]*3) idx3++;   
if (res[i] ==res[idx5]*5) idx5++;     
if (res[i] ==res[idx7]*7) idx7++;   
        }      
returnres[k-1];
    }
};

python

classSolution: 
defgetKthMagicNumber(self, k: int) ->int:
res= [1] *kidx3, idx5, idx7=0, 0, 0foriinrange(1, k):  
res[i] =min(res[idx3]*3, res[idx5]*5, res[idx7]*7)            ifres[i] ==res[idx3]*3: idx3+=1ifres[i] ==res[idx5]*5: idx5+=1ifres[i] ==res[idx7]*7: idx7+=1returnres[k-1]

参考资料


[1]

LeetCode 面试题 17.09. 第 k 个数: https://leetcode-cn.com/problems/get-kth-magic-number-lcci/

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~


相关文章
|
C语言
一个C语言面试的经典例题
一个C语言面试的经典例题
127 0
一个C语言面试的经典例题
|
数据可视化 Java
每日面试:经典死锁问题 | 如何解决死锁问题 | 多线程
每日面试:经典死锁问题 | 如何解决死锁问题 | 多线程
144 0
|
Java Spring
《云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧》电子版地址
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧
99 0
《云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧》电子版地址
|
存储 算法
【面试锦囊】位运算介绍与经典例题总结
位运算隐藏在编程语言的角落中,其神秘而又强大,暗藏内力,有些人光听位运算的大名的心中忐忑,还有些人更是一看到位运算就远远离去,我之前也是。但狡猾的面试官往往喜欢搞偷袭,抓住我们的弱点搞我们,为了防患于未然,特记此篇!
107 0
【面试锦囊】位运算介绍与经典例题总结
|
消息中间件 缓存 安全
蚂蚁金服一面:题解析十道经典面试
用到分布式事务嘛?为什么用这种方案,有其他方案嘛?
228 0
|
SQL 分布式计算 Hadoop
【Hadoop技术篇】hive的优化,经典面试
1) 开启配置:set hive.optimize.bucketmapjoin = true; 2) 一个表的bucket数是另一个表bucket数的==整数倍== 3) bucket列 == join列 4) 满足map join条件
254 0
【Hadoop技术篇】hive的优化,经典面试
|
存储 缓存 算法
面试中有哪些经典的数据库问题?
面试中有哪些经典的数据库问题?
77 0
面试中有哪些经典的数据库问题?
|
缓存 JavaScript 前端开发
面试高频 —— 与浏览器相关的几道经典难题详解
在浏览器中输入URL并回车后都发生了什么?(阿里真题)
81 0
面试高频 —— 与浏览器相关的几道经典难题详解
|
设计模式 存储 缓存