欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

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

  分析:寻找一个数是不是满足某种数(质数,水仙数)等,最简单的方法就是遍历,对于任意一个丑数必定可以写成2^m*3^n*5^p,因而对于一个丑数,只含有2,3,5因子,也就意味着该数number%2==0;number%3==0;number%5==0,如果一个数能被2整除,我们就连续除以2;能被3整除,我们就连续除以3;能被5整除,我们就连续除以5;如果最后得到1,则该数是素数,否则是丑数。

  上面计算中主要的不足在于,逐一遍历,这样对于不是丑数的数的判断会造成大量的时间浪费,如果能够根据已经计算好的丑数,计算出下一个丑数就可以避免这种情况,实现从丑数到丑数的高效算法,根据定义可知,后面的丑数肯定是前面已知丑数乘以2,3,5得到的。

  我们假设一个数组中已经有若干丑数,并且这些丑数是按顺序排列的,我们把现有的最大丑数记为max,则下一个丑数肯定是前面丑数乘以2,3,5得到的。不妨考虑乘以2得到的情况,我们把数组中的每一个数都乘以2,由于原数组是有序的,因为乘以2后也是有序递增的,这样必然存在一个数M2,它前面的每一个数都是小于等于max,而包括M2在内的后面的数都是大于max的,因为我们还是要保持递增顺序,所以我们取第一个大于max的数M2。同理对于乘以3的情况,可以取第一个大于max的数M3,对于乘以5的情况,可以取第一个大于max的数M5。

  最终下一个丑数取:min{M2,M3,M5}即可。

int GetUglyNumber_Solution2(int index)

{

if(index <= 0)

return 0;

int *pUglyNumbers = new int[index];

pUglyNumbers[0] = 1;

int nextUglyIndex = 1;

int *pMultiply2 = pUglyNumbers;

int *pMultiply3 = pUglyNumbers;

int *pMultiply5 = pUglyNumbers;

while(nextUglyIndex < index)

{

int min = Min(*pMultiply2 * 2, *pMultiply3 * 3, *pMultiply5 * 5);

pUglyNumbers[nextUglyIndex] = min;

while(*pMultiply2 * 2 <= pUglyNumbers[nextUglyIndex])

++pMultiply2;

while(*pMultiply3 * 3 <= pUglyNumbers[nextUglyIndex])

++pMultiply3;

while(*pMultiply5 * 5 <= pUglyNumbers[nextUglyIndex])

++pMultiply5;

++nextUglyIndex;

}

int ugly = pUglyNumbers[nextUglyIndex - 1];

delete[] pUglyNumbers;

return ugly;

}

int Min(int number1, int number2, int number3)

{

int min = (number1 < number2) ? number1 : number2;

min = (min < number3) ? min : number3;

return min;

}

 第二种方法由于不需要在非丑数的整数花费时间,因而时间复杂度要小很多,在vc6+win7的平台上,index=1500时,方法1的运行时间为40s,方法2的时间是1s;然而方法2需要动态分配内存,占用空间,而方法2则没有这样的内存开销。说白了,第二种方法是用空间换时间

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

每日一道算法题-寻找丑数相关推荐

  1. 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...

    前言 最近准备把算法慢慢的捡起来,所以准备日更一道算法题目,难度自然是由简入难,所以同学们可以每天都来看看小编的更新. 日更时间定在每晚20:00,希望大家多多关注啦. 昨天就欠更了,简直就是打脸.过 ...

  2. 每日一道算法题--leetcode 509--斐波那契数(动态规划)--python

    [题目描述] [代码思路] 自底向上的动态规划,避免了采用递归浪费空间以及重复计算. [源代码] class Solution(object):def fib(self, N):"" ...

  3. 每日一道算法题 拿金币(蓝桥杯练习系统)简单的dp算法

    资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就 ...

  4. 每日一道算法题 - LongestWord(easy-1)

    虽然都是很简单的算法,每个都只需5分钟左右,但写起来总会遇到不同的小问题,希望大家能跟我一起每天进步一点点. 更多的小算法练习,可以查看我的文章. 规则 Using the JavaScript la ...

  5. 每日一道算法题--leetcode 169--求众数--python--两种方法

    [题目描述] [求众数I] [算法思路] [方法一] 在不要求时间空间复杂度的情况下,可以采用的方法很多,最简单易懂的一种就是对nums中每个值统计一下数量,如果数量大于nums长度的一半,就直接返回 ...

  6. 每日一道算法题 - KaprekarsConstant(hard-1)

    虽然都是很简单的算法,每个都只需5分钟左右,但写起来总会遇到不同的小问题,希望大家能跟我一起每天进步一点点. 更多的小算法练习,可以查看我的文章. 规则 Using the JavaScript la ...

  7. 每日一道算法题--leetcode 746--使用最小花费爬楼梯--python

    [题目描述] !!题干里的示例1需要仔细看一下哦,要到达顶层,即20那一层,可以跳过20这一层达到更高一层,也因此我们给cost数组最后加一个元素0,模拟最顶层的上一层无须花费力气. [代码思路] 最 ...

  8. 每日一道算法题--leetcode 179--最大数--python

    [题目描述] [代码思路] 第一反应是用冒泡排序,但是时间复杂度比较高,所以采用了python库函数简化代码.其实这道题就是要对比 int(str(nums[i])+str(nums[i+1])) 和 ...

  9. 每日一道算法题:高楼扔鸡蛋问题(动态规划问题)

    题目是这样:你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1).现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低 ...

最新文章

  1. 计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours()介绍
  2. Ubuntu/linux 系统彻底杀死一个进程的方法
  3. [linux] shell脚本编程-统计日志文件中的设备号发通知邮件
  4. 初识Microsoft Hyper-v Server
  5. 注释嵌套注释_DIY注释
  6. Pentium的指令系统(5)——调用/转移/循环控制/中断指令
  7. mysql undrop_MySQL · 数据恢复 · undrop-for-innodb
  8. 手把手教你升级到MySQL 8.0
  9. python字符串与url编码的转换
  10. 深入理解Android之Java Security第一部分
  11. 辣子鸡-辣子鸡家常做法
  12. 【JavaWeb】火车票管理系统 (三)用户登录-03
  13. 相机照片大小设置_我应该为运动照片使用哪些相机设置?
  14. gcc for arm 工具链使用(一)
  15. 实验二 SQL 语言——SELECT 查询操作(第一部分)
  16. 将火狐浏览器默认搜索引擎设置为“百度”
  17. linux系统可以玩星际争霸吧,《星际争霸》4.0版本更新说明
  18. dwqa问答默认single.php,WordPress互动问答插件DW Question Answer使用教程
  19. 2022年高精度仪表放大器市场深度分析及发展研究预测报告
  20. LTE同步技术(一)

热门文章

  1. JMeter 下载安装教程
  2. P1312 Mayan游戏 [模拟][搜索]
  3. HSRP双机热备工作原理与配置
  4. 汇编入门学习笔记 (十二)—— int指令、port
  5. Linux知识积累(8)卸载安装jdk
  6. C# 该行已经属于还有一个表 的解决方法
  7. ANT 运行jar包的中文乱码问题
  8. 使用装饰器时带括号与不带括号的区别
  9. arm-linux-gdb正确无错误安装
  10. Windows7 Search Federation功能解读