醜數
劍指OFFER題36------按牛客網熱度排序
時間:2018.12.17.2102
作者:Waitt
題目
把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。
時間限制:1秒 空間限制:32768K 熱度指數:199821
解答
連結: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)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
………………
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index<1)//當index輸入錯誤時的處理
return index;
/*也可換成
if(index < 7) return index;// 0-6的醜數分別為0-6
*/
vector<int> a;
a.push_back(1);
int t1,t2,t3;
t1=t2=t3=0;
for(int i=0;i<index;i++)
{
int dang=min(a[t1]*2,min(a[t2]*3,a[t3]*5));
if(dang==a[t1]*2)
t1++;
if(dang==a[t2]*3)
t2++;
if(dang==a[t3]*5)
t3++;
a.push_back(dang);
}
return a[index-1];
}
};
相關文章
- LeetCode 263[醜數]LeetCode
- JZ-033-醜數
- LeetCode|劍指 Offer 49.醜數LeetCode
- 劍指offer第49題 醜數
- 醜數問題——動態規劃、Java動態規劃Java
- 醜數,即只包含質因數 2、3 和 5 的正整數。
- 劍指offer—49.醜數—分析及程式碼(Java)Java
- 264、醜數 II | 演算法(leetcode,附思維導圖 + 全部解法)300題演算法LeetCode
- LeetCode題解:264. 醜數 II,二叉堆,JavaScript,詳細註釋LeetCodeJavaScript
- [獻醜了!] Android AOP註解GoodAtAndroidGo
- 如何gulp壓縮,醜化程式碼
- prettier 把我程式碼弄的很醜
- 微前端:好、壞、醜逐個分析! - KBall前端
- 禮物醜要不要說出來
- Sailthru:Facebook醜聞對人們的影響AI
- .NET進階篇-醜話先說,Flag先立
- 為什麼 Django 後臺管理系統那麼“醜”?Django
- 用 Flutter 水一個可醜的漸變首頁(二)Flutter
- 不好意思,我就是覺得新寶可夢醜
- 人醜沒關係,現在的女孩擇偶還看手?
- AI在用 | 又醜又萌,Remini+Wink搞定最火黏土風vlogAIREM
- 一個註解@Recover搞定醜陋的迴圈重試程式碼
- 撕掉“醜”的標籤,體素是如何讓遊戲更有趣的?遊戲
- Python 程式碼寫得醜怎麼辦,試試這幾款神器Python
- 整個領域沒了!學術界有史以來最大的醜聞
- 你在「動森」裡遇到的那些「醜動物」,後來怎麼樣了?
- 美國兩政府網站被掛馬以性醜聞女星為誘餌網站
- 華盛頓特區就劍橋分析公司資料醜聞起訴Facebook
- 都說印表機又笨又醜 這一回聯想小新給你好看!
- AI發展這一年:不斷衍生的技術醜聞與抵制聲潮AI
- win10 字型醜怎麼辦_win10字型難看如何變好看Win10
- iPhone XI那些事:iPhone XI外觀被批太醜,但拍照提升不容小覷!iPhone
- 為什麼醜陋的UI介面卻能創造良好的使用者體驗?UI
- 子不嫌母醜,狗不嫌家貧,狗狗對人類的忠誠是唯一的
- 資料洩露醜聞之後 Facebook使用者使用率不減反增
- 雖然《劍/盾》寶可夢確實很醜,但設計上還是很有趣的
- 被領導吐槽做圖表太醜?5大資料視覺化工具助你翻身大資料視覺化
- Go 泛型變更:約束太醜了,先移動到 x/exp 做實驗性功能Go泛型