【剑指offer】丑数

时间:2023-06-05 14:11:38

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

leetcode上也有这道题。不过是判断一个数是否为丑数。貌似是我第二道解出来的leetcode,印象还蛮深的。用了递归。

class Solution {
public:
bool isUgly(int num) {
if (num<=) return false;
if (num==) return true;
if (num%==)
isUgly(num/);
else if (num%==)
isUgly(num/);
else if (num%==)
isUgly(num/);
else
return false;
}
};

但是这道题是给出第N个丑数。所以如果每个数都判断是否为丑数,比较耗时。剑指offer里看过又忘记了==|||

只记得用数组,根据已经有的丑数去计算,具体的记不清楚了。

1是第一个丑数,第二个丑数由1* 2/3/5中产生,其中最小的既是下一个丑数。——2(接下来的丑数将包含两个2的因子max2+1)

第二个丑数由2* 2/3/5还有上次的1*3/5中产生,最小的3既是下一个丑数。——3(接下来的丑数将包含两个3的因子max3+1)

·

·

·

数组中第N个项既是第N个丑数。

class Solution {
public:
int getMin(int max2,int max3,int max5){
int min = max2<max3?max2:max3;
return min<max5?min:max5;
}
int GetUglyNumber_Solution(int index) {
int* Array=new int[index];
Array[]=;
int *max2 = Array;
int *max3 = Array;
int *max5 = Array;
for(int i=;i<index;i++){
int min = getMin(*max2*,*max3*,*max5*);
Array[i] = min;
while(*max2* <= Array[i])
++max2;
while(*max3* <= Array[i])
++max3;
while(*max5* <= Array[i])
++max5; }
return Array[index-];
}
};