剑指offer(18)-丑数
来源:互联网 发布:ipsec提供网络层之上 编辑:程序博客网 时间:2024/06/01 16:11
题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
直观的想法:从1开始一个个判断数字是否为丑数,遇见丑数就记录下来,直到找到低N个为止,不过这样计算复杂度太大。
class Solution {public: int GetUglyNumber_Solution(int index) { if (index <= 0) return 0; int count = 0; int UglyNum = 1; while (count < index) { if (isUglyNumber(UglyNum)){ count++; } UglyNum++; } return UglyNum; } bool isUglyNumber(int number) { while (number % 2 == 0) number /= 2; while (number % 3 == 0) number /= 3; while (number % 5 == 0) number /= 5; return number == 1 ? 1 : 0; }};
书中介绍了一种较为高效的解法:
既然要求的丑数最简因子为2,3,5的倍数,先将基数1分别乘以2,3,5,从中找出最小的数,这个数就是下一个丑数。用pMultiply2,pMultiply3和pMultiply5三个指针分别指向小于这个丑数除以2,3,5后的数,不断循环,直到找到满足N的值为止。详细的分析过程可阅读相关章节。
class Solution {public: int GetUglyNumber_Solution(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; return min < number3 ? min : number3; }};
1 0
- 剑指offer(18)-丑数
- 【剑指offer】丑数
- 剑指offer-丑数
- 《剑指offer》丑数
- 【剑指Offer】丑数
- 剑指offer:丑数
- 剑指offer-丑数
- [剑指offer]丑数
- 剑指offer:丑数
- [剑指offer]丑数
- 《剑指offer》-丑数
- 剑指offer----丑数
- 剑指offer|丑数
- 剑指offer-丑数
- 剑指Offer:丑数
- 剑指offer--丑数
- 剑指offer-丑数
- 剑指offer 丑数
- spring事务管理
- 标识符--Java基础004
- VirtualBox安装Mac
- springMVC源码--Controller控制器
- bank conflict
- 剑指offer(18)-丑数
- [生存志] 第106节 韩非孤愤说难
- request,response,session,cookie,application
- Apache POI
- JUnit
- spring常见问题以及解决方法
- 【Android基础笔记21】ViewPager
- SpringBoot项目实战--Servlet、Filter、拦截器
- ionic slide-box(滑动框)