lintcode 醜數II
描述
設計一個演算法,找出只含素因子2
,3
,5
的第 n 小的數。
符合條件的數如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
我們可以認為1
也是一個醜數
解法:只含素因子2或3或5的數可以表示成。
假設我們得到了上一個醜數,通過*2,*3或者*5可以得到新的醜數。
問題是:去重 剔除像2*2*3=2*3*2這種情況;
演算法:
1.最初的醜數為1。
2.我們使用3個遊標p1=p2=p3=1,他們所指向的位置,分別*2,*3,*5得到下一個醜數。
3.我們要從小到大生成醜數,因此我們當前生成的醜數為Arr[p1]*2,Arr[p2]*3,Arr[p3]*5中的最小值。
4.當我們得到最小值之後,我們需要判斷這個醜數是哪個遊標導致的,將這個遊標的索引++。
5.生成的第n個醜數即為所要求的值。
AC程式碼:
class Solution {
public:
/**
* @param n: An integer
* @return: the nth prime number as description.
*/
int nthUglyNumber(int n) {
// write your code here
int Arr[n+1],p2,p3,p5;
p2=p3=p5=1;
Arr[1]=1;
for(int i=2;i<=n;i++){
Arr[i]=min(min(Arr[p2]*2,Arr[p3]*3),Arr[p5]*5);
if(Arr[i]==Arr[p2]*2){
p2++;
}
if(Arr[i]==Arr[p3]*3){
p3++;
}
if(Arr[i]==Arr[p5]*5){
p5++;
}
}
return Arr[n];
}
};