33.醜數
阿新 • • 發佈:2019-01-06
des class number while .get ger scribe mat 指針
乘以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
題目描述
把只包含質因子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我們沒有必要維護三個隊列,只需要記錄三個指針顯示到達哪一步;“|”表示指針,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
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.醜數