国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

劍指offer(C++)-JZ49:丑數(shù)(算法-其他)

這篇具有很好參考價值的文章主要介紹了劍指offer(C++)-JZ49:丑數(shù)(算法-其他)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

作者:翟天保Steven
版權聲明:著作權歸作者所有,商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處

劍指offer(C++)-JZ49:丑數(shù)(算法-其他),劍指offer,算法,c++

題目描述:

把只包含質因子2、3和5的數(shù)稱作丑數(shù)(Ugly Number)。例如6、8都是丑數(shù),但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個丑數(shù)。求按從小到大的順序的第 n個丑數(shù)。

數(shù)據(jù)范圍:0≤n≤2000

要求:空間復雜度 O(n)?, 時間復雜度 O(n)

示例:

輸入:

7

返回值:

8

解題思路:

本題考察算法思維。兩種解題思路:

1)優(yōu)先隊列-最小堆

? ? ? ?丑數(shù)是含質因子2、3、5的數(shù),從1開始,1乘這三個因數(shù)得到的數(shù)就是丑數(shù),以此類推,丑數(shù)乘因數(shù)也是丑數(shù)。考慮到這樣操作可能會有重復,所以借助map完成去重。再構建優(yōu)先隊列-小頂堆往里面塞入丑數(shù),放入的過程會自動進行排序,排序復雜度在O(log2n)。

? ? ? ?假設獲取前n個丑數(shù),就進行n次循環(huán),每次循環(huán)將最小的丑數(shù)彈出,并放入新的丑數(shù),放入的時候還需要進行重復性判斷。

? ? ? ?綜合下來,算法時間復雜度為O(nlog2n)。

2)動態(tài)規(guī)劃

? ? ? ?丑數(shù)1 2 3 4 5 6 8 9 10等等,每個丑數(shù)一定是前面某個數(shù)的235倍數(shù),可結合動態(tài)規(guī)劃思想,設置三個步進下標ijk,將已知丑數(shù)依次乘235得到后續(xù)丑數(shù),在此過程中還需要確保丑數(shù)是從小到大放入容器的,即進行最小值比較。

? ? ? ?為了直觀些,簡單模擬下前面幾步的流程:

1)開始ijk均為0,則從數(shù)字1開始,丑數(shù)后續(xù)依次為2 3 5,其中2最小,則i升為1。

2)i為1,即第二個丑數(shù)2,用2的2倍也就是4和3 5比較,此時3最小,則j升為1。

3)i和j為1,即用第二個丑數(shù)2的2倍3倍,即4和6,和5比較,此時4最小,則i繼續(xù)升為2。

4)i為2,j為1,k為0,用3的2倍、2的3倍、1的5倍比較,即6 6 4,此時5最小,則k升為1。

5)i為2,j為1,k為1,用3的2倍、2的3倍,2的5倍比較,即6 6 10,此時6最小,i和j同時升1。

? ? ? ?從上述5步可看到全局規(guī)律,ijk是從前往后慢慢推進的,結合了動態(tài)規(guī)劃的思想,后續(xù)步進以前面為基準,動態(tài)擴展后續(xù)丑數(shù)

? ? ? ?該算法時間復雜度為O(n),也是題目理想解法。

測試代碼:

1)優(yōu)先隊列-最小堆

#include <queue>
class Solution {
public:
    // 獲取丑數(shù)
    int GetUglyNumber_Solution(int index) {
        // 判空
        if(index == 0){
            return 0;
        }
        // 定義因數(shù)集合
        vector<int> factors = { 2, 3, 5};
        // 定義哈希表
        unordered_map<long, bool> um;
        // 定義優(yōu)選隊列-小頂堆
        priority_queue<long, vector<long>, greater<>> pq;
        // 放入1
        um[long(1)] = true;
        pq.push(long(1));
        long result = 0;
        for(int i = 0; i < index; ++i){
            // 每次取頂,也就是最小值,彈出
            result = pq.top();
            pq.pop();
            for(int j = 0; j < 3; ++j){
                // 存入235倍數(shù)的值
                long temp = result * factors[j];
                // 只存放非重復值
                if(um.find(temp) == um.end()){
                    um[temp] = true;
                    pq.push(temp);
                }
            }
        }
        return int(result);
    }
};

2)動態(tài)規(guī)劃文章來源地址http://www.zghlxwxcb.cn/news/detail-777498.html

#include <queue>
class Solution {
public:
    // 獲取丑數(shù)
    int GetUglyNumber_Solution(int index) {
        // 判空
        if(index == 0){
            return 0;
        }
        // 定義丑數(shù)集合
        vector<int> uglyNums = { 1 };
        // 循環(huán)按規(guī)律找到所有丑數(shù)
        int i = 0, j = 0, k = 0;
        int t;
        for(t = 0; t < index; ++t){
            // ijk表示已知丑數(shù)乘235的進度
            // 舉例說明
            // 1)開始ijk均為0,則從數(shù)字1開始,丑數(shù)后續(xù)依次為2 3 5,其中2最小,則i升為1
            // 2)i為1,即第二個丑數(shù)2,用2的2倍也就是4和3 5比較,此時3最小,則j升為1
            // 3)i和j為1,即用第二個丑數(shù)2的2倍3倍,即4和6,和5比較,此時4最小,則i繼續(xù)升為2
            // 4)i為2,j為1,k為0,用3的2倍、2的3倍、1的5倍比較,即6 6 4,此時5最小,則k升為1
            // 5)i為2,j為1,k為1,用3的2倍、2的3倍,2的5倍比較,即6 6 10,此時6最小,i和j同時升1
            // 從上述5步可看到全局規(guī)律,ijk是從前往后慢慢推進的,結合了動態(tài)規(guī)劃的思想,后續(xù)步進以前面為基準,動態(tài)擴展后續(xù)丑數(shù)
            int num2 = uglyNums[i] * 2;
            int num3 = uglyNums[j] * 3;
            int num5 = uglyNums[k] * 5;
            int minNum = min(num2, min(num3, num5));
            uglyNums.push_back(minNum);
            if(minNum == num2){
                i++;
            }
            if(minNum == num3){
                j++;
            }
            if(minNum == num5){
                k++;
            }
        }
        return uglyNums[t - 1];
    }
};

到了這里,關于劍指offer(C++)-JZ49:丑數(shù)(算法-其他)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 劍指offer(C++)-JZ12:矩陣中的路徑(算法-回溯)

    劍指offer(C++)-JZ12:矩陣中的路徑(算法-回溯)

    作者:翟天保Steven 版權聲明:著作權歸作者所有,商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處 題目描述: 請設計一個函數(shù),用來判斷在一個n乘m的矩陣中是否存在一條包含某長度為len的字符串所有字符的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以

    2024年02月11日
    瀏覽(23)
  • 劍指offer(C++)-JZ13:機器人的運動范圍(算法-回溯)

    劍指offer(C++)-JZ13:機器人的運動范圍(算法-回溯)

    作者:翟天保Steven 版權聲明:著作權歸作者所有,商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處 題目描述: 地上有一個 rows 行和 cols 列的方格。坐標從 [0,0] 到 [rows-1,cols-1] 。一個機器人從坐標 [0,0] 的格子開始移動,每一次只能向左,右,上,下四個方向移動一格,

    2024年02月12日
    瀏覽(37)
  • 劍指offer(C++)-JZ63:買賣股票的最好時機(一)(算法-動態(tài)規(guī)劃)

    劍指offer(C++)-JZ63:買賣股票的最好時機(一)(算法-動態(tài)規(guī)劃)

    作者:翟天保Steven 版權聲明:著作權歸作者所有,商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處 題目描述: 假設你有一個數(shù)組prices,長度為n,其中prices[i]是股票在第i天的價格,請根據(jù)這個價格數(shù)組,返回買賣股票能獲得的最大收益 1.你可以買入一次股票和賣出一

    2024年02月04日
    瀏覽(26)
  • 劍指offer(C++)-JZ64:求1+2+3+...+n(算法-位運算)

    劍指offer(C++)-JZ64:求1+2+3+...+n(算法-位運算)

    作者:翟天保Steven 版權聲明:著作權歸作者所有,商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處 題目描述: 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等及條件判斷語句(A?B:C)。 數(shù)據(jù)范圍: 0n≤200 進階: 空間復雜度 O(1)?,時間復雜

    2024年02月09日
    瀏覽(17)
  • 劍指offer(C++)-JZ46:把數(shù)字翻譯成字符串(算法-動態(tài)規(guī)劃)

    劍指offer(C++)-JZ46:把數(shù)字翻譯成字符串(算法-動態(tài)規(guī)劃)

    作者:翟天保Steven 版權聲明:著作權歸作者所有,商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處 題目描述: 有一種將字母編碼成數(shù)字的方式:\\\'a\\\'-1, \\\'b-2\\\', ... , \\\'z-26\\\'。 現(xiàn)在給一串數(shù)字,返回有多少種可能的譯碼結果 數(shù)據(jù)范圍:字符串長度滿足 0n≤90 進階:空間復雜度

    2024年02月07日
    瀏覽(23)
  • 劍指offer(C++)-JZ56:數(shù)組中只出現(xiàn)一次的兩個數(shù)字(算法-位運算)

    劍指offer(C++)-JZ56:數(shù)組中只出現(xiàn)一次的兩個數(shù)字(算法-位運算)

    作者:翟天保Steven 版權聲明:著作權歸作者所有,商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處 題目描述: 一個整型數(shù)組里除了兩個數(shù)字只出現(xiàn)一次,其他的數(shù)字都出現(xiàn)了兩次。請寫程序找出這兩個只出現(xiàn)一次的數(shù)字。 數(shù)據(jù)范圍:數(shù)組長度2≤n≤1000,數(shù)組中每個數(shù)

    2024年02月10日
    瀏覽(22)
  • 劍指offer(C++)-JZ48:最長不含重復字符的子字符串(算法-動態(tài)規(guī)劃)

    劍指offer(C++)-JZ48:最長不含重復字符的子字符串(算法-動態(tài)規(guī)劃)

    作者:翟天保Steven 版權聲明:著作權歸作者所有,商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處 題目描述: 請從字符串中找出一個最長的不包含重復字符的子字符串,計算該最長子字符串的長度。 數(shù)據(jù)范圍: ?s.length≤40000?s.length≤40000 示例: 輸入: 返回值: 說明

    2024年02月06日
    瀏覽(25)
  • 劍指offer--JZ6 從尾到頭打印鏈表

    劍指offer--JZ6 從尾到頭打印鏈表

    我寫不出來,參考別人的代碼后理清思路后再寫的C語言版本,代碼如下: 最難理解的是創(chuàng)建結果數(shù)組那里。我竟然不知道有這種語法。我看了老半天。malloc動態(tài)申請的內存可以看作數(shù)組使用,而且能使用數(shù)組的方式來訪問元素。 大致講解下整體思路: 1.創(chuàng)建一個頭結點hea

    2024年02月11日
    瀏覽(25)
  • (其他) 劍指 Offer 67. 把字符串轉換成整數(shù) ——【Leetcode每日一題】

    (其他) 劍指 Offer 67. 把字符串轉換成整數(shù) ——【Leetcode每日一題】

    難度:中等 寫一個函數(shù) StrToInt,實現(xiàn)把字符串轉換成整數(shù)這個功能。不能使用 atoi 或者其他類似的庫函數(shù)。 首先,該函數(shù)會根據(jù)需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止。 當我們尋找到的第一個非空字符為正或者負號時,則將該符號與之后面盡可

    2024年02月09日
    瀏覽(27)
  • 《劍指offer》(3)排序算法篇

    《劍指offer》(3)排序算法篇

    class Solution: ? ? def duplicate(self , numbers: List[int]) - int: ? ? ? ? if len(numbers) = 1: ? ? ? ? ? ? return -1 ? ? ? ? import collections ? ? ? ? num_dict = collections.Counter(numbers) ? ? ? ? res = [key for (key,value) in num_dict.items() if value 1] ? ? ? ? return res[0] class Solution: ? ? def sort(self,num): #快排

    2024年02月13日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包