1. 程式人生 > >33.醜數

33.醜數

des class number while .get ger scribe mat 指針

題目描述

把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。

題目解答

我們可以維護三個隊列: (1)醜數數組: 1 乘以2的隊列:2 乘以3的隊列:3 乘以5的隊列:5 選擇三個隊列頭最小的數2加入醜數數組,同時將該最小的數乘以2,3,5放入三個隊列; (2)醜數數組:1,2 乘以2的隊列:4 乘以3的隊列:3,6 乘以5的隊列:5,10 選擇三個隊列頭最小的數3加入醜數數組,同時將該最小的數乘以2,3,5放入三個隊列; (3)醜數數組:1,2,3
乘以2的隊列:4,6 乘以3的隊列:6,9 乘以5的隊列:5,10,15 選擇三個隊列頭裏最小的數4加入醜數數組,同時將該最小的數乘以2,3,5放入三個隊列; (4)醜數數組:1,2,3,4 乘以2的隊列:6,8 乘以3的隊列:6,9,12 乘以5的隊列:5,10,15,20 選擇三個隊列頭裏最小的數5加入醜數數組,同時將該最小的數乘以2,3,5放入三個隊列; (5)醜數數組:1,2,3,4,5 乘以2的隊列:6,8,10, 乘以3的隊列:6,9,12,15 乘以5的隊列:10,15,20,25 選擇三個隊列頭裏最小的數6加入醜數數組,但我們發現,有兩個隊列頭都為6,所以我們彈出兩個隊列頭,同時將12,18,30放入三個隊列;

我們沒有必要維護三個隊列,只需要記錄三個指針顯示到達哪一步;“|”表示指針,arr表示醜數數組; (1)1 |2 |3 |5 目前指針指向0,0,0,隊列頭arr[0] * 2 = 2, arr[0] * 3 = 3, arr[0] * 5 = 5 (2)1 2 2 |4 |3 6 |5 10 目前指針指向1,0,0,隊列頭arr[1] * 2 = 4, arr[0] * 3 = 3, arr[0] * 5 = 5
(3)1 2 3 2| 4 6 3 |6 9 |5 10 15 目前指針指向1,1,0,隊列頭arr[1] * 2 = 4, arr[1] * 3 = 6, arr[0] * 5 = 5
import java.util.ArrayList;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index<7){
            return index;
        }
        int p2=0,p3=0,p5=0,newNum=1;
        ArrayList<Integer> list=new ArrayList<>();
        list.add(newNum);
        while(list.size()<index){
            int m2=list.get(p2)*2;
            int m3=list.get(p3)*3;
            int m5=list.get(p5)*5;
            newNum=Math.min(m2,Math.min(m3,m5));
            list.add(newNum);
            if(newNum==m2) p2++;
            if(newNum==m3) p3++;
            if(newNum==m5) p5++;
        }
        return newNum;
    }
}

java新建可變長度的數組用ArrayList

33.醜數