题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路
- 暴力解法,超时了
class Solution {
public:
bool isUgly(int n){
while(n%2==0) n=n/2;
while(n%3==0) n=n/3;
while(n%5==0) n=n/5;
return (n==1)? true:false;
}
int GetUglyNumber_Solution(int index) {
int cnt=0;
if(index<=0) return 0;
int num=0;
while(cnt<index){
num++;
if(isUgly(num)) cnt++;
}
return num;
}
};
- 剑指offer
class Solution {
public:
static int minf(int a, int b, int c){
int minv = (a<b)? a:b;
minv = (minv<c)? minv:c;
return minv;
}
int GetUglyNumber_Solution(int index) {
// 0-6的丑数分别为0-6
if(index < 7) return index;
//p2,p3,p5分别为三个队列的指针,newNum为从队列头选出来的最小数
int p2 = 0, p3 = 0, p5 = 0, newNum = 1;
vector<int> arr;
arr.push_back(newNum);
while(arr.size() < index) {
//选出三个队列头最小的数
newNum = minf(arr[p2] * 2, arr[p3] * 3, arr[p5] * 5);
//newNum = min(arr[p2] * 2, min(arr[p3] * 3, arr[p5] * 5));
//这三个if有可能进入一个或者多个,进入多个是三个队列头最小的数有多个的情况
if(arr[p2] * 2 == newNum) p2++;
if(arr[p3] * 3 == newNum) p3++;
if(arr[p5] * 5 == newNum) p5++;
arr.push_back(newNum);
}
return newNum;
}
};