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

算法打卡day32|貪心算法篇06|Leetcode 738.單調(diào)遞增的數(shù)字、968.監(jiān)控二叉樹

這篇具有很好參考價(jià)值的文章主要介紹了算法打卡day32|貪心算法篇06|Leetcode 738.單調(diào)遞增的數(shù)字、968.監(jiān)控二叉樹。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??算法題

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

題目鏈接:738.單調(diào)遞增的數(shù)字

?大佬視頻講解:單調(diào)遞增的數(shù)字視頻講解

?個(gè)人思路

這個(gè)題目就是從例子中找規(guī)律,例如 332,從后往前遍歷,32不是單調(diào)遞增將2變?yōu)?,3減1,變成了329,遍歷到2,32不是遞增,將2變?yōu)?,3減1,變成299,符合題目條件,打印輸出。

解法
貪心法

這道題只能從后往前遍歷,因?yàn)槿绻菑那跋蚝蟊闅v的話,拿例子332看,第一步變成了292,第二步變成了289,并不是真正的結(jié)果299。

而從后向前遍歷,就可以重復(fù)利用上次比較得出的結(jié)果了,從后向前遍歷332的數(shù)值變化為:332 -> 329 -> 299;確定了遍歷順序之后,發(fā)現(xiàn)局部最優(yōu)就可以推出全局,可以用貪心?

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n);//int變?yōu)樽址?        char[] chars = s.toCharArray();//轉(zhuǎn)為字符數(shù)組

        int start = s.length();//從后往前遍歷 
        for (int i = s.length() - 2; i >= 0; i--) {

            if (chars[i] > chars[i + 1]) {//不符合單調(diào)遞增 
                chars[i]--;//元素減一
                start = i+1;//更改需要變?yōu)?的位置
            }

        }
        for (int i = start; i < s.length(); i++) {
            chars[i] = '9';
        }
        return Integer.parseInt(String.valueOf(chars));//轉(zhuǎn)為integer類型
    }
}

時(shí)間復(fù)雜度:O(n);(遍歷字符串中的每個(gè)字符)

空間復(fù)雜度:O( 1);(無動(dòng)態(tài)使用空間)


?Leetcode ?968.監(jiān)控二叉樹

題目鏈接:968.監(jiān)控二叉樹

大佬視頻講解:監(jiān)控二叉樹視頻講解

個(gè)人思路

一整個(gè)難住,看看題解...

解法
貪心法

根據(jù)題目所給例子,知道攝像頭不能安裝到葉子節(jié)點(diǎn),因?yàn)檫@樣會(huì)浪費(fèi)一層監(jiān)控空間,所以安裝攝像頭從下往上考慮,先給葉子節(jié)點(diǎn)父節(jié)點(diǎn)放個(gè)攝像頭,然后隔兩個(gè)節(jié)點(diǎn)放一個(gè)攝像頭,直至到二叉樹頭結(jié)點(diǎn).

下往上看,局部最優(yōu):讓葉子節(jié)點(diǎn)的父節(jié)點(diǎn)安攝像頭,所用攝像頭最少,整體最優(yōu):全部攝像頭數(shù)量所用最少!局部最優(yōu)可以推出全局最優(yōu),找不出反例,用貪心

1.確定遍歷順序

二叉樹從低向上推導(dǎo),可以使用后序遍歷(左右中)

在遍歷時(shí)取了左孩子的返回值,右孩子的返回值, 以便推導(dǎo)中間節(jié)點(diǎn)的狀態(tài)

2.隔兩個(gè)節(jié)點(diǎn)放一個(gè)攝像頭狀態(tài)分析

每個(gè)節(jié)點(diǎn)可能有如下三種狀態(tài),可以分別有三個(gè)數(shù)字來表示

  • 該節(jié)點(diǎn)無覆蓋? ?-> 0
  • 本節(jié)點(diǎn)有攝像頭? ?-> 1
  • 本節(jié)點(diǎn)有覆蓋? ?-> 2

為了讓攝像頭數(shù)量最少,先葉子節(jié)點(diǎn)的父節(jié)點(diǎn)安裝攝像頭

終止條件:空節(jié)點(diǎn)的判斷;返回狀態(tài)值只能是有覆蓋(2),否則不滿足在葉子節(jié)點(diǎn)父節(jié)點(diǎn)安裝攝像頭

單層邏輯處理主要有如下四類情況

情況1:左右節(jié)點(diǎn)都有覆蓋

左孩子有覆蓋,右孩子有覆蓋,那么此時(shí)中間節(jié)點(diǎn)應(yīng)該就是無覆蓋的狀態(tài)了。

如圖:

算法打卡day32|貪心算法篇06|Leetcode 738.單調(diào)遞增的數(shù)字、968.監(jiān)控二叉樹,算法,貪心算法,leetcode,數(shù)據(jù)結(jié)構(gòu),職場和發(fā)展

情況2:左右節(jié)點(diǎn)至少有一個(gè)無覆蓋的情況

如果是以下情況,則中間節(jié)點(diǎn)(父節(jié)點(diǎn))應(yīng)該放攝像頭:

  • left == 0 && right == 0 左右節(jié)點(diǎn)無覆蓋
  • left == 1 && right == 0 左節(jié)點(diǎn)有攝像頭,右節(jié)點(diǎn)無覆蓋
  • left == 0 && right == 1 左節(jié)點(diǎn)有無覆蓋,右節(jié)點(diǎn)攝像頭
  • left == 0 && right == 2 左節(jié)點(diǎn)無覆蓋,右節(jié)點(diǎn)覆蓋
  • left == 2 && right == 0 左節(jié)點(diǎn)覆蓋,右節(jié)點(diǎn)無覆蓋

有一個(gè)孩子沒有覆蓋,父節(jié)點(diǎn)就應(yīng)該放攝像頭,攝像頭的數(shù)量要加一,并且return 1,代表中間節(jié)點(diǎn)放攝像頭。

情況3:左右節(jié)點(diǎn)至少有一個(gè)有攝像頭

如果是以下情況,其實(shí)就是 左右孩子節(jié)點(diǎn)有一個(gè)有攝像頭了,那么其父節(jié)點(diǎn)就為2(覆蓋的狀態(tài))

  • left == 1 && right == 2 左節(jié)點(diǎn)有攝像頭,右節(jié)點(diǎn)有覆蓋
  • left == 2 && right == 1 左節(jié)點(diǎn)有覆蓋,右節(jié)點(diǎn)有攝像頭
  • left == 1 && right == 1 左右節(jié)點(diǎn)都有攝像頭

情況4:頭結(jié)點(diǎn)沒有覆蓋

遞歸結(jié)束之后,可能頭結(jié)點(diǎn) 還有一個(gè)無覆蓋的情況,如下圖,所以遞歸結(jié)束之后,還要判斷根節(jié)點(diǎn),如果沒有覆蓋,result++

算法打卡day32|貪心算法篇06|Leetcode 738.單調(diào)遞增的數(shù)字、968.監(jiān)控二叉樹,算法,貪心算法,leetcode,數(shù)據(jù)結(jié)構(gòu),職場和發(fā)展

class Solution {
    int  res=0;
    public int minCameraCover(TreeNode root) {
        if(minCame(root)==0){// 情況4:對(duì)根節(jié)點(diǎn)的狀態(tài)做檢驗(yàn)
            res++;
        }
        return res;
    }
    
    public int minCame(TreeNode root){
        if(root==null){ // 空節(jié)點(diǎn)默認(rèn)為 有覆蓋狀態(tài),避免在葉子節(jié)點(diǎn)上放攝像頭
            return 2;
        }

        int left=minCame(root.left);
        int  right=minCame(root.right);

        // 情況1:如果左右節(jié)點(diǎn)都覆蓋了的話, 那么本節(jié)點(diǎn)的狀態(tài)就應(yīng)該是無覆蓋,沒有攝像頭
        if(left==2&&right==2){:
            return 0;

        }else if(left==0||right==0){
            //情況2: 左右節(jié)點(diǎn)都是無覆蓋狀態(tài),那 根節(jié)點(diǎn)此時(shí)應(yīng)該放一個(gè)攝像頭
            res++;
            return 1;// 狀態(tài)值為 1 攝像頭數(shù) ++;

        }else{
            // 情況3:左右節(jié)點(diǎn)至少存在 1個(gè)攝像頭,那么本節(jié)點(diǎn)就是處于被覆蓋狀態(tài)
            return 2;
        }
    }
}

時(shí)間復(fù)雜度:O(n );(遍歷整棵樹)

空間復(fù)雜度:O(n);(數(shù)的高度,最差情況下為n)


?以上是個(gè)人的思考反思與總結(jié),若只想根據(jù)系列題刷,參考卡哥的網(wǎng)址代碼隨想錄算法官網(wǎng)文章來源地址http://www.zghlxwxcb.cn/news/detail-852900.html

到了這里,關(guān)于算法打卡day32|貪心算法篇06|Leetcode 738.單調(diào)遞增的數(shù)字、968.監(jiān)控二叉樹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

    2024年02月08日
    瀏覽(22)
  • leetcode 738. 單調(diào)遞增的數(shù)字

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

    ? ? ? ? ?這題用暴力法會(huì)超時(shí),我就沒試了,采用了個(gè)挺巧的方法,為了方便需要先將整數(shù)n轉(zhuǎn)換為字符串的形式,然后從后向前遍歷,當(dāng)兩個(gè)數(shù)字非遞增時(shí),將前一個(gè)數(shù)字--,后一個(gè)數(shù)字的位置記錄在index中,之后需要將這個(gè)index以后的數(shù)字全賦為9。? 為了防止將不需要賦

    2024年02月14日
    瀏覽(20)
  • 【Leetcode】 738. 單調(diào)遞增的數(shù)字

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

    當(dāng)且僅當(dāng)每個(gè)相鄰位數(shù)上的數(shù)字 x 和 y 滿足 x = y 時(shí),我們稱這個(gè)整數(shù)是 單調(diào)遞增 的。 給定一個(gè)整數(shù) n ,返回 小于或等于 n 的最大數(shù)字,且數(shù)字呈 單調(diào)遞增 。 示例 1 : 輸入 : n = 10 輸出 : 9 示例 2 : 輸入 : n = 1234 輸出 : 1234 示例3 : 輸入 : n = 332 輸出 : 299 提示: AC : 需要注意的點(diǎn)

    2024年02月07日
    瀏覽(22)
  • DAY40:貪心算法(九)單調(diào)遞增的數(shù)字(貪心的思路)

    DAY40:貪心算法(九)單調(diào)遞增的數(shù)字(貪心的思路)

    本題暴力解法也需要看一下,雖然暴力解法超時(shí)了,但是這種思路是一種很基礎(chǔ)的思路,需要了解 數(shù)字是沒有辦法直接采用下標(biāo)遍歷的 ,如果 要for循環(huán)遍歷每個(gè)位置的數(shù)字,需要把數(shù)字轉(zhuǎn)成字符串string 當(dāng)且僅當(dāng)每個(gè)相鄰位數(shù)上的數(shù)字 x 和 y 滿足 x = y 時(shí),我們稱這個(gè)整數(shù)是

    2024年02月12日
    瀏覽(17)
  • 單調(diào)遞增的數(shù)字——力扣738

    單調(diào)遞增的數(shù)字——力扣738

    題目描述 解法

    2024年02月13日
    瀏覽(18)
  • 貪心算法學(xué)習(xí)——最長單調(diào)遞增子序列

    貪心算法學(xué)習(xí)——最長單調(diào)遞增子序列

    目錄 ?編輯 一,題目 二,題目接口 三,解題思路和代碼 給你一個(gè)整數(shù)數(shù)組? nums ?,找到其中最長嚴(yán)格遞增子序列的長度。 子序列? 是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如, [3,6,2,7] ?是數(shù)組? [0,3,1,6,2,2,7] ?的子序列。 ?

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

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

    2024年01月22日
    瀏覽(23)
  • LeetCode打卡 day58--單調(diào)棧

    LeetCode打卡 day58--單調(diào)棧

    單調(diào)棧的應(yīng)用, 就是需要構(gòu)建一個(gè)單調(diào)遞增或者單調(diào)遞減的棧, 去解決下一個(gè)大(小)的元素的問題 題目鏈接 給定一個(gè)整數(shù)數(shù)組 temperatures ,表示每天的溫度,返回一個(gè)數(shù)組 answer ,其中 answer[i] 是指對(duì)于第 i 天,下一個(gè)更高溫度出現(xiàn)在幾天后。如果氣溫在這之后都不會(huì)升高,請(qǐng)

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

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

    2024年02月13日
    瀏覽(23)
  • Day37 貪心算法part06

    前面都想到了,結(jié)果最后n[i]給寫錯(cuò)了直接寫成9了,得把后面的全都改成9才行 攝像頭的覆蓋范圍是上中下 遇到葉子結(jié)點(diǎn),放到葉子結(jié)點(diǎn)的父節(jié)點(diǎn) 每隔兩個(gè)空節(jié)點(diǎn)放一個(gè)攝像頭 所以要用后序遍歷 把結(jié)點(diǎn)分為三個(gè)狀態(tài):0無覆蓋1有攝像頭2有覆蓋 空節(jié)點(diǎn)要設(shè)置為有覆蓋的狀態(tài)

    2024年02月19日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包