Leetcode 264. 醜數 II (數論,三指針,類dp)

264. 醜數 II

編寫一個程序,找出第 n 個醜數。

醜數就是隻包含質因數 2, 3, 5 的正整數

示例:

輸入: n = 10
輸出: 12
解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個醜數。

說明:  

  1. 1 是醜數。
  2. 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];

    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章