日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

剑指offer-丑数

發布時間:2023/11/27 生活经验 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指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-丑数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。