剑指offer-丑数
生活随笔
收集整理的這篇文章主要介紹了
剑指offer-丑数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
把只包含質因子2、3和5的數稱作丑數(Ugly Number)。例如6、8都是丑數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個丑數。求按從小到大的順序的第N個丑數。 解析來源?https://www.nowcoder.com/questionTerminal/6aa9e04fc3794f68acf8778237ba065b首先從丑數的定義我們知道,一個丑數的因子只有2,3,5,那么丑數p = 2 ^ x * 3 ^ y * 5 ^ z,換句話說一個丑數一定由另一個丑數乘以2或者乘以3或者乘以5得到,那么我們從1開始乘以2,3,5,就得到2,3,5三個丑數,在從這三個丑數出發乘以2,3,5就得到4,6,10,6,9,15,10,15,25九個丑數,我們發現這種方法會得到重復的丑數,而且我們題目要求第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放入三個隊列; …………………… 疑問: 1.為什么分三個隊列? 丑數數組里的數一定是有序的,因為我們是從丑數數組里的數乘以2,3,5選出的最小數,一定比以前未乘以2,3,5大,同時對于三個隊列內部,按先后順序乘以2,3,5分別放入,所以同一個隊列內部也是有序的; 2.為什么比較三個隊列頭部最小的數放入丑數數組? 因為三個隊列是有序的,所以取出三個頭中最小的,等同于找到了三個隊列所有數中最小的。 實現思路: 我們沒有必要維護三個隊列,只需要記錄三個指針顯示到達哪一步;“|”表示指針,arr表示丑數數組;
1 public int GetUglyNumber_Solution(int index) {//mytip 2 if(index<=0){ 3 return 0; 4 } 5 ArrayList<Integer> un = new ArrayList<>(index); 6 un.add(1); 7 int index2=0; 8 int index3=0; 9 int index5=0; 10 for(int i=1;i<index;i++){ 11 int value =Math.min(un.get(index2)*2,Math.min(un.get(index3)*3,un.get(index5)*5)); 12 if(value ==un.get(index2)*2) index2++; 13 if(value ==un.get(index3)*3) index3++; 14 if(value ==un.get(index5)*5) index5++; 15 un.add(value); 16 } 17 return un.get(index-1); 18 }
?
轉載于:https://www.cnblogs.com/zhacai/p/10713500.html
總結
以上是生活随笔為你收集整理的剑指offer-丑数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模块三
- 下一篇: 河北的特岗老师工资待遇怎么样??