您的位置:首页 > 其它

LeetCode---Ugly Number II

2015-12-02 13:14 399 查看
题目大意:给出一个数n,求出第n个丑数。所谓丑数是指只能被2,3,5整除的数。1是第一个丑数。

算法思想:

1.利用一个数组存储现有的丑数使其有序排列。

2.然后将数组中的每一个数分别乘以2,3,5得到一批新的丑数,将其已经存在数组中的丑数排除。找出最小的那个数即是数组中的下一个数。

3.为了简化步骤2,可知数组存在一个数使得在它前面的数乘以2小于等于当前最大的丑数,使得它后面的数乘以2都大于当前最大的丑数,记录这个数为T2,同理可得T3和T5.

4.数组中下一个丑数即为min(T2*2,T3*3,T5*5).

代码如下:

class Solution {
public:
int nthUglyNumber(int n) {
if (n<=0) return 0;
int* uglyNumbers= new int
;
int* mulity2 = uglyNumbers;
int* mulity3 = uglyNumbers;
int* mulity5 = uglyNumbers;
uglyNumbers[0] = 1;
int nextIndex = 1;
while (nextIndex<n){
uglyNumbers[nextIndex] = minNum(*mulity2*2,*mulity3*3,*mulity5*5);
while (*mulity2 * 2 <= uglyNumbers[nextIndex]){
++mulity2;
}
while (*mulity3 * 3 <= uglyNumbers[nextIndex]){
++mulity3;
}
while (*mulity5 * 5 <= uglyNumbers[nextIndex]){
++mulity5;
}

++nextIndex;
}
int ugly = uglyNumbers[nextIndex-1];
delete[] uglyNumbers;
return ugly;
}
int minNum(int a,int b,int c){
int temp = a < b ? a : b;
return temp < c ? temp : c;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: