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

算法訓練day37|貪心算法 part06(LeetCode738.單調(diào)遞增的數(shù)字)

這篇具有很好參考價值的文章主要介紹了算法訓練day37|貪心算法 part06(LeetCode738.單調(diào)遞增的數(shù)字)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

738.單調(diào)遞增的數(shù)字

題目鏈接????
給定一個非負整數(shù) N,找出小于或等于 N 的最大的整數(shù),同時這個整數(shù)需要滿足其各個位數(shù)上的數(shù)字是單調(diào)遞增。
(當且僅當每個相鄰位數(shù)上的數(shù)字 x 和 y 滿足 x <= y 時,我們稱這個整數(shù)是單調(diào)遞增的。)

示例 1:
輸入: N = 10
輸出: 9

示例 2:
輸入: N = 1234
輸出: 1234

示例 3:
輸入: N = 332
輸出: 299
說明: N 是在 [0, 10^9] 范圍內(nèi)的一個整數(shù)。

思路分析

暴力解法會超時。
題目要求小于等于N的最大單調(diào)遞增的整數(shù),那么拿一個兩位的數(shù)字來舉例。

例如:98,一旦出現(xiàn)strNum[i - 1] > strNum[i]的情況(非單調(diào)遞增),首先想讓strNum[i - 1]–,然后strNum[i]給為9,這樣這個整數(shù)就是89,即小于98的最大的單調(diào)遞增整數(shù)。

這一點如果想清楚了,這道題就好辦了。

此時是從前向后遍歷還是從后向前遍歷呢?

從前向后遍歷的話,遇到strNum[i - 1] > strNum[i]的情況,讓strNum[i - 1]減一,但此時如果strNum[i - 1]減一了,可能又小于strNum[i - 2]。

這么說有點抽象,舉個例子,數(shù)字:332,從前向后遍歷的話,那么就把變成了329,此時2又小于了第一位的3了,真正的結(jié)果應該是299。

那么從后向前遍歷,就可以重復利用上次比較得出的結(jié)果了,從后向前遍歷332的數(shù)值變化為:332 -> 329 -> 299

確定了遍歷順序之后,那么此時局部最優(yōu)就可以推出全局,找不出反例,試試貪心。

代碼實現(xiàn)

C++代碼如下:

class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        string strNum = to_string(N);
        // flag用來標記賦值9從哪里開始
        // 設(shè)置為這個默認值,為了防止第二個for循環(huán)在flag沒有被賦值的情況下執(zhí)行
        int flag = strNum.size();
        for (int i = strNum.size() - 1; i > 0; i--) {
            if (strNum[i - 1] > strNum[i] ) {
                flag = i;
                strNum[i - 1]--;
            }
        }
        for (int i = flag; i < strNum.size(); i++) {
            strNum[i] = '9';
        }
        return stoi(strNum);
    }
};

我的:
我的是從前向后遍歷的,用一個maxindex來記錄目前出現(xiàn)過的最大的數(shù)(如果有332這種,就記錄第一個3,這樣結(jié)果是299,否則結(jié)果是329就不對了),其實maxindex就是記錄一旦出現(xiàn)遞減的數(shù),該從哪里開始自減。文章來源地址http://www.zghlxwxcb.cn/news/detail-700730.html

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string strn=to_string(n);
        int maxindex=0;
        for(int i=1;i<strn.size();i++){
            if(strn[i]>strn[i-1]) maxindex=i;
            if(strn[i]<strn[i-1]){
                strn[maxindex]--;
                for(int j=maxindex+1;j<strn.size();j++) strn[j]='9';
            }
        }
        int result=stoi(strn);
        return result;
    }
};

到了這里,關(guān)于算法訓練day37|貪心算法 part06(LeetCode738.單調(diào)遞增的數(shù)字)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 貪心算法part6 | ● 738.單調(diào)遞增的數(shù)字 ● 968.監(jiān)控二叉樹

    代碼隨想錄算法訓練營第一天 | 題目、題目 738.單調(diào)遞增的數(shù)字 局部最優(yōu):前一個數(shù)比當前數(shù)小,前一個數(shù)位減一,當前數(shù)置為9 題目要求小于等于N的最大單調(diào)遞增的整數(shù),那么拿一個兩位的數(shù)字來舉例。 例如:98,一旦出現(xiàn)strNum[i - 1] strNum[i]的情況(非單調(diào)遞增),首先想

    2024年02月10日
    瀏覽(20)
  • 算法訓練day36|貪心算法 part05(重疊區(qū)間三連擊:LeetCode435. 無重疊區(qū)間763.劃分字母區(qū)間56. 合并區(qū)間)

    算法訓練day36|貪心算法 part05(重疊區(qū)間三連擊:LeetCode435. 無重疊區(qū)間763.劃分字母區(qū)間56. 合并區(qū)間)

    題目鏈接???? 給定一個區(qū)間的集合,找到需要移除區(qū)間的最小數(shù)量,使剩余區(qū)間互不重疊。 注意: 可以認為區(qū)間的終點總是大于它的起點。 區(qū)間 [1,2] 和 [2,3] 的邊界相互“接觸”,但沒有相互重疊。 示例 1: 輸入: [ [1,2], [2,3], [3,4], [1,3] ] 輸出: 1 解釋: 移除 [1,3] 后,剩下的區(qū)

    2024年02月09日
    瀏覽(94)
  • Day32- 貪心算法part06

    題目一:738. 單調(diào)遞增的數(shù)字? 738. 單調(diào)遞增的數(shù)字 當且僅當每個相鄰位數(shù)上的數(shù)字? x ?和? y ?滿足? x = y ?時,我們稱這個整數(shù)是 單調(diào)遞增 的。 給定一個整數(shù)? n ?,返回? 小于或等于? n ?的最大數(shù)字,且數(shù)字呈? 單調(diào)遞增 ?。 從高位到低位遍歷整數(shù) n 的每一位數(shù)字,當

    2024年01月22日
    瀏覽(23)
  • 【LeetCode題目詳解】第八章 貪心算法 part05 435. 無重疊區(qū)間 763.劃分字母區(qū)間 56. 合并區(qū)間 (day36補)

    【LeetCode題目詳解】第八章 貪心算法 part05 435. 無重疊區(qū)間 763.劃分字母區(qū)間 56. 合并區(qū)間 (day36補)

    給定一個區(qū)間的集合? intervals ?,其中 intervals[i] = [starti, endi] ?。返回 需要移除區(qū)間的最小數(shù)量,使剩余區(qū)間互不重疊? 。 示例 1: 示例 2: 示例 3: 提示: 1 = intervals.length = 105 intervals[i].length == 2 -5 * 104?= starti? endi?= 5 * 104 相信很多同學看到這道題目都冥冥之中感覺要排序,但

    2024年02月11日
    瀏覽(21)
  • 力扣第738題 單調(diào)遞增的數(shù)字 c++ 暴力超時 貪心優(yōu)化

    力扣第738題 單調(diào)遞增的數(shù)字 c++ 暴力超時 貪心優(yōu)化

    738. 單調(diào)遞增的數(shù)字 中等 相關(guān)標簽 貪心??數(shù)學 當且僅當每個相鄰位數(shù)上的數(shù)字? x ?和? y ?滿足? x = y ?時,我們稱這個整數(shù)是 單調(diào)遞增 的。 給定一個整數(shù)? n ?,返回? 小于或等于? n ?的最大數(shù)字,且數(shù)字呈? 單調(diào)遞增 ?。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 109 從N開始

    2024年02月08日
    瀏覽(22)
  • 算法訓練day31貪心算法理論基礎(chǔ)Leetcode455分發(fā)餅干376擺動序列53最大子序和

    文章鏈接 代碼隨想錄 (programmercarl.com) 說實話貪心算法并沒有固定的套路 。 最好用的策略就是舉反例,如果想不到反例,那么就試一試貪心吧 。 面試中基本不會讓面試者現(xiàn)場證明貪心的合理性,代碼寫出來跑過測試用例即可,或者自己能自圓其說理由就行了 。 刷題或者面

    2024年02月20日
    瀏覽(20)
  • 算法記錄 | Day37 貪心算法

    算法記錄 | Day37 貪心算法

    思路: 1.一旦出現(xiàn)strNum[i - 1] strNum[i]的情況(非單調(diào)遞增),首先想讓strNum[i - 1]–,然后strNum[i]給為9,這樣這個整數(shù)就是89,即小于98的最大的單調(diào)遞增整數(shù)。 2.向后遍歷 從前向后遍歷的話,遇到strNum[i - 1] strNum[i]的情況,讓strNum[i - 1]減一,但此時如果strNum[i - 1]減一了,可能

    2023年04月22日
    瀏覽(17)
  • day44代碼訓練|動態(tài)規(guī)劃part06

    day44代碼訓練|動態(tài)規(guī)劃part06

    完全背包和01背包問題唯一不同的地方就是,每種物品有無限件 。 1. dp數(shù)組的含義 dp[i][j] 0-i物品,重量為j的容量時,最大的價值 2. 遞推公式 dp[i][j] = max(dp[i-1][j],dp[i][j-weight[i]]+value[i]); 兩種狀態(tài),不用物品i的話,直接是用dp[i-1][j] 選用物品的話,為了重復使用物品i,其實是

    2024年02月03日
    瀏覽(23)
  • 算法刷題Day 37 單調(diào)遞增的數(shù)字+監(jiān)聽二叉樹

    兩個可能經(jīng)常要用到的函數(shù) 字符串轉(zhuǎn)數(shù)字: to_string() 數(shù)字轉(zhuǎn)字符串: stoi() 利用樹后續(xù)遍歷,同時加上狀態(tài)轉(zhuǎn)移的方法,非常值得反復學習

    2024年02月13日
    瀏覽(22)
  • Day 37 貪心算法 6

    代碼隨想錄? 1. 思路 從后向前判斷,如果不呈現(xiàn)單調(diào)遞增的狀態(tài),后一位變成9,前一位-1。這里局部最優(yōu)是每兩位的最優(yōu)解,從后向前線性遍歷能得到全局最優(yōu)。 但是有一點沒有想清楚 。如果出現(xiàn)了上述的兩位數(shù)倒序情況,之后的所有數(shù)字都應該變成9。例如52583,最小的遞

    2024年02月01日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包