Ugly Number
Posted summerkiki
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ugly Number相关的知识,希望对你有一定的参考价值。
解题思路的几个关键:
1. 丑数应该是另一个丑数乘以2、3或者5的结果(1默认为丑数)
2. 要确保丑数是排好序的,因此可以考虑把已有的每个丑数乘以2、3和5,选择其中大于当前最大丑数M的最小值,作为下一个丑数
3. 由于数组中的丑数是按序排放,对于乘以2而言,肯定存在某一个丑数T2,排在它之前的每一个数乘以2都小于M,排在它后面的每一个乘以2都大于M。因此,只需要记录下这个位置,同时每次生成新的丑数时,更新这个位置即可。乘以3与5同理。
class Solution { public: int min(int x2, int x3, int x5) { int num = (x2<=x3)?x2:x3; num = (num<=x5)?num:x5; return num; } int nthUglyNumber(int n) { if(n<=0) return 0; int *uglynumber=new int[n]; uglynumber[0]=1; int count=1; int *p2=uglynumber; int *p3=uglynumber; int *p5=uglynumber; while(count<n) { uglynumber[count]=min((*p2)*2,(*p3)*3,(*p5)*5); while((*p2)*2<=uglynumber[count]) p2++; while((*p3)*3<=uglynumber[count]) p3++; while((*p5)*5<=uglynumber[count]) p5++; ++count; } return uglynumber[count-1]; } };
一定要注意数组边界的变化!!
以上是关于Ugly Number的主要内容,如果未能解决你的问题,请参考以下文章