算法复习:丑数
来源:互联网 发布:apache 安装版下载 编辑:程序博客网 时间:2024/05/29 13:36
题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路
(1)常规方法:从1开始判断是否丑数。通过3个while循环将数除以2,3,5,初到除不尽为止,判断结果是否为1。然后累计丑数的个数即可。
(2)方法一的效率不高,即使不是丑数也需要进行计算。因此,我们可以不对非丑数进行计算。通过观察发现丑数是由更小的丑数乘以2,3或者5得到的,所以可以保存之前的丑数,我们可以保存三个下标,这三个下标的数乘以2,3或者5后的结果要刚大于最后一个丑数,这样就可以保证每次取得的丑数是最小的(需要按顺序)并且不会重复。
代码:
public static int GetUglyNumber_Solution(int index) { if (index <= 0) return 0; int[] uglyNumbers = new int[index]; uglyNumbers[0] = 1; int nextUglyIndex = 1; //保存3个下标,这3个下标的数对应的乘积要比最新的丑数要大(避免重复计算相同的丑数) int multiply2Index = 0; int multiply3Index = 0; int multiply5Index = 0; while (nextUglyIndex < index) { uglyNumbers[nextUglyIndex] = min(uglyNumbers[multiply2Index] * 2, uglyNumbers[multiply3Index] * 3, uglyNumbers[multiply5Index] * 5); while (uglyNumbers[multiply2Index] * 2 <= uglyNumbers[nextUglyIndex]) multiply2Index++; while (uglyNumbers[multiply3Index] * 3 <= uglyNumbers[nextUglyIndex]) multiply3Index++; while (uglyNumbers[multiply5Index] * 5 <= uglyNumbers[nextUglyIndex]) multiply5Index++; nextUglyIndex++; } return uglyNumbers[nextUglyIndex - 1];}public static int min(int a, int b, int c) { int min = a > b ? b : a; min = min > c ? c : min; return min;}
阅读全文
0 0
- 算法复习:丑数
- 算法题目---丑数
- 算法题/丑数
- 算法分析---寻找丑数
- 算法题38 寻找丑数
- 丑数Ugly Number查找算法
- 寻找丑数-算法-java语言
- 每日一道算法题-寻找丑数
- 编程算法 - 丑数 代码(C)
- 面试算法(三十四)丑数
- 每日一道算法题:寻找丑数
- 每日一算法---寻找丑数
- 丑数
- 丑数
- 丑数
- 丑数
- 丑数
- 丑数
- Struts2笔记第一天
- js使用排他思想实现导航栏的切换
- 栈的应用:计算字符串表达式
- Mac OS Git 安装
- 【Java】Gson解析复杂数据
- 算法复习:丑数
- 个人笔记4
- arm-linux 汇总
- 数据结构封装之《LinkQueue链式队列》
- Java websocket入门
- iOS模拟器不能输入中文解决
- chromebook lenovo n21折腾笔记
- 数据结构封装之《SeqQueue顺序式队列》
- 前端页面适配的rem换算