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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Leetcode 264. 丑数 II 解题思路及C++实现

發(fā)布時間:2025/4/16 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。