Day33:丑数
剑指Offer_编程题——丑数
题目描述:
把只包含质因子2、3、5的数称为丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含了质因子7.习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体思路:
最直接的暴力解法是从1开始依次判断数字是否为丑数,直到达到要求的丑数个数。当然这种方法肯定是会TLE的,所以我们分析一下丑数的生成特点(这里把1排除):因为丑数只包含质因子2,3,5,假设我们已经有n-1个丑数,按照顺序排列,且第n-1的丑数为M。那么第n个丑数一定是由这n-1个丑数分别乘以2,3,5,得到的所有大于M的结果中,最小的那个数。事实上我们不需要每次都计算前面所有丑数乘以2,3,5的结果,然后再比较大小。因为在已存在的丑数中,一定存在某个数T2,在它之前的所有数乘以2都小于已有丑数,而T2*2的结果一定大于M,同理,也存在这样的数T3,T5,我们只需要标记这三个数即可。我们可以按照以上思路执行一遍。具体过程如下:
具体我们用java和python将其实现。首先我们用java实现。
public class Solution{
public int GetUglyNumber_Solution(int index){
if(index <= 6)
return index;
int [] dp = new int[index];
int i2 = 0;
int i3 = 0;
int i5 = 0;
dp[0] = 1;
for(int i = 1; i < index; i++){
int next2 = dp[i2] * 2;
int next3 = dp[i3] * 3;
int next5 = dp[i5] * 5;
dp[i] = Math.min(next2, Math.min(next3, next5));
if(dp[i] == next2)
i2++;
if(dp[i] == next3)
i3++;
if(dp[i] == next5)
i5++;
}
return dp[index - 1];
}
}
代码效果图如图所示:
接下来我们用python将其实现
class Solution:
def GetUglyNumber_Solution(self, index):
if index == 0:
return 0
baseList = [1]
min2 = min3 = min5 = 0
curNum = 1
while curNum < index:
minNum = min(baseList[min2]*2, baseList[min3]*3, baseList[min5]*5)
baseList.append(minNum)
while baseList[min2] * 2 <= minNum:
min2 += 1
while baseList[min3] * 3 <= minNum:
min3 += 1
while baseList[min5] * 5 <= minNum:
min5 += 1
curNum += 1
return baseList[-1]
代码效果图如图所示:
总结
本道题主要是通过新概念考察穷举法,此题比较简单,很容易想到思路,但是如果直接暴力算法,可能反而通不过,由于执行时间过长。占用内存空间过多,因此,需要我们优化其算法思路,并且通过了java和python将其实现,优化过后发现其时间复杂度很低的。空间占用也很少的。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!
参考文献
[1] 一颗随风而倒的墙头草 [2] IDEA_TEYU_1112
- Ajax几种常用模式
- dubbox升级spring到4.x及添加log4j2支持
- CSS魔法堂:Absolute Positioning就这个样
- MongoDB(一)环境搭建与初始配置
- AI进了直播间,这画风666
- CSS布局:水平居中
- docker学习(4) 一些常用操作
- Java多线程之细说线程池
- Windows8异步编程的注意事项
- Spring(一)Spring的第一滴血
- Flume(一)Flume原理解析
- 我所理解的Remoting (2) :远程对象的生命周期管理[下篇]
- struts2(六)之ognl表达式与ActionContext、ValueStack
- Windows8异步编程的注意事项
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【python-leetcode325-滑动窗口法】最大子数组之和为k
- 爬取51job出现can only concatenate str (not “NoneType“) to str
- springboot之基于注解整合mybatis
- springboot之基于配置文件整合mybatis
- springboot之整合JPA
- springboot之自定义starter
- 【python-leetcode340-滑动窗口法】至多包含 K 个不同字符的最长子串
- 要不是真的喜欢学技术,谁会来爬小姐姐啊。
- springboot缓存之@CachePut注解
- springboot缓存之@Caching和@CacheConfig注解
- BERT源码分析(PART III)
- springboot之整合基本的jdbc并操作Mysql数据库
- springboot缓存之自定义CacheManager
- springboot缓存之使用redis作为缓存管理
- 【python-leetcode904-滑动窗口法】水果成篮