Leetcode 264. 丑数 II 解题思路及C++实现
生活随笔
收集整理的這篇文章主要介紹了
Leetcode 264. 丑数 II 解题思路及C++实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
方法一:暴力解法
解題思路:
直接從整數(shù)1開始,不斷遞增,判斷該數(shù)字是否為丑數(shù)(專門寫一個判斷是否為丑數(shù)的函數(shù)),當遇到一個丑數(shù),則計數(shù)值加1,直至遇到n個丑數(shù)為止。
當n很大時,這種暴力解法會遇到 超出時間限制的問題,代碼如下:
class Solution { public:int nthUglyNumber(int n) {int i = 1;int num = 0;while(num < n){bool tmp = whetherUgly(i);if(tmp) num++;i++;}return i-1;}//判斷是否為丑數(shù)的函數(shù)bool whetherUgly(int num){if(num == 0) return false;while(num % 5 == 0) num = num / 5;while(num % 3 == 0) num = num / 3;while(num % 2 == 0) num = num / 2;if(num == 1) return true;else return false;} };?
方法二:最小堆解法
解題思路:
因為丑數(shù)都是2,3,5的乘積,大的丑數(shù)可由小的丑數(shù)分別乘以2,3,5得到。所以可以使用一個最小堆不斷更新,每第i次更新,得到對應第i大的丑數(shù)。每一次更新,從最小堆中pop出一個最小值,就是第i大的丑數(shù)(但是要注意處理掉重復的丑數(shù))。
在每一次更新里,需要將堆中的最小丑數(shù)分別乘以2,3,5放進堆中。
class Solution { public:int nthUglyNumber(int n) {if(n == 0) return 0;int i = 0;priority_queue<int, vector<int>, greater<int>> pq; //最小堆pq.push(1);int last = 0;while(i < n){if(last == pq.top()) pq.pop(); //堆頂元素大小與上一個相同,則跳過else{long tmp = pq.top();if(tmp * 2 < INT_MAX) pq.push(tmp * 2); //tmp*2如果大于INT_MAX,則認為無需考慮if(tmp * 3 < INT_MAX) pq.push(tmp * 3);if(tmp * 5 < INT_MAX) pq.push(tmp * 5);pq.pop();last = tmp;i++;}}return last;} };?
方法三:動態(tài)規(guī)劃
做到動態(tài)規(guī)劃部分時再繼續(xù)更新~
?
?
?
?
總結
以上是生活随笔為你收集整理的Leetcode 264. 丑数 II 解题思路及C++实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode 215. 数组中的第K
- 下一篇: Leetcode 313. 超级丑数 解