編寫一個程序,找出第 n
個醜數。
醜數就是隻包含質因數 2, 3, 5
的正整數。
示例:
輸入: n = 10
輸出: 12
解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
是前 10 個醜數。
說明:
1
是醜數。n
不超過1690。
這道題暴力會超時,所以換種方法:三指針法
具體而言是指置三指針index2,index3,index5,比方說當前要求的是第i個醜數,我們已經知道前i-1個醜數,這一定是從這前i-1個醜數中產生的,初始時index2=index3=index5=1,指在1這個數的下標(我們設下標是1)
一開始,醜數只有{1},1可以同2,3,5相乘,取最小的1×2=2添加到醜數序列中。
現在醜數中有{1,2},在上一步中,1已經同2相乘過了,所以今後沒必要再比較1×2了,我們說1失去了同2相乘的資格。
現在1有與3,5相乘的資格,2有與2,3,5相乘的資格,但沒必要,所以index3,index5下標不移動,還是1這個數的位置
然後取2作爲第二個數,index2++,指針移動,以此類推,只要被取到就移動直到我們求得了n個數
class Solution {
public int nthUglyNumber(int n) {
int index2=0,index3=0,index5=0,k=1;
int []ans=new int[n];
ans[0]=1;
while(k<n)
{
ans[k]=Math.min(ans[index2]*2,Math.min(ans[index3]*3,ans[index5]*5));
if(ans[index2]*2==ans[k])index2++;
if(ans[index3]*3==ans[k])index3++;
if(ans[index5]*5==ans[k])index5++;
k++;
}
return ans[n-1];
}
}