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

【算法練習(xí)Day51】柱狀圖中最大的矩形

這篇具有很好參考價(jià)值的文章主要介紹了【算法練習(xí)Day51】柱狀圖中最大的矩形。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【算法練習(xí)Day51】柱狀圖中最大的矩形,練題,算法

???個(gè)人主頁:@Sherry的成長(zhǎng)之路
??學(xué)習(xí)社區(qū):Sherry的成長(zhǎng)之路(個(gè)人社區(qū))
??專欄鏈接:練題
??長(zhǎng)路漫漫浩浩,萬事皆有期待

柱狀圖中最大的矩形

力扣題目鏈接

給定 n 個(gè)非負(fù)整數(shù),用來表示柱狀圖中各個(gè)柱子的高度。每個(gè)柱子彼此相鄰,且寬度為 1 。

求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

示例 1:

輸入:heights = [2,1,5,6,2,3]
輸出:10
解釋:最大的矩形為圖中紅色區(qū)域,面積為 10

示例 2:

輸入: heights = [2,4]
輸出: 4

思路

接雨水 中是找每個(gè)柱子左右兩邊第一個(gè)大于該柱子高度的柱子,而本題是找每個(gè)柱子左右兩邊第一個(gè)小于該柱子的柱子。

為什么這么說呢,因?yàn)槿缦聢D所示,高為3的柱子可以繼續(xù)往右邊蔓延擴(kuò)大面積,如果往左邊的話則長(zhǎng)度不夠
【算法練習(xí)Day51】柱狀圖中最大的矩形,練題,算法

所以要找當(dāng)前柱子i左右兩側(cè)第一個(gè)小于他的柱子

動(dòng)態(tài)規(guī)劃

對(duì)于下標(biāo)i而言,能勾勒出的最大面積是什么?

以i為中心, 向左尋找第一個(gè)小于height[i]的下標(biāo)minLeftIndex, 向右尋找第一個(gè)小于height[i]的下標(biāo)minRightIndex, 即最大面積 = height[i] * (minRightIndex - minLeftIndex - 1)

如示例1中,求i=4的最大面積
【算法練習(xí)Day51】柱狀圖中最大的矩形,練題,算法

正向遍歷數(shù)組 height 得到數(shù)組 minLeftIndex的每個(gè)索引值(第一小于當(dāng)前柱子高度的索引值),反向遍歷數(shù)組 height 得到數(shù)組minRightIndex(第一小于當(dāng)前柱子高度的索引值)

完整代碼:

public int largestRectangleArea(int[] heights) {
    int[] minLeftIndex = new int[heights.length];
    int[] minRightIndex = new int[heights.length];

    // 記錄每個(gè)柱子 左邊第一個(gè)小于該柱子的下標(biāo)
    minLeftIndex[0] = -1;
    for (int i = 1; i < heights.length; i++) {
        int left = i - 1;
        // 這里不是用if,而是不斷向左尋找的過程
        while (left >= 0 && heights[left] >= heights[i]) {
            left = minLeftIndex[left];
        }
        minLeftIndex[i] = left;
    }

    // 記錄每個(gè)柱子 右邊第一個(gè)小于該柱子的下標(biāo)
    minRightIndex[heights.length - 1] = heights.length;
    for (int i = heights.length - 2; i >= 0; i--) {
        int right = i + 1;
        // 這里不是用if,而是不斷向右尋找的過程
        while (right < heights.length && heights[right] >= heights[i]) {
            right = minRightIndex[right];
        }
        minRightIndex[i] = right;
    }

    // 求和
    int res = 0;
    for (int i = 0; i < heights.length; i++) {
        int sum = heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1);
        res = Math.max(sum, res);
    }
    return res;
}

單調(diào)棧

本題是找每個(gè)柱子左右兩邊第一個(gè)小于該柱的柱子。這里就涉及到了單調(diào)棧很重要的性質(zhì),就是單調(diào)棧里的順序,是從小到大還是從大到小。

在題解 接雨水 中接雨水的單調(diào)棧從棧頭(元素從棧頂彈出)到棧底的順序應(yīng)該是從小到大的順序。

那么因?yàn)楸绢}是要找每個(gè)柱子左右兩邊第一個(gè)小于該柱子的柱子,所以從棧頂?shù)綏5椎捻樞驊?yīng)該是從大到小的順序!

如圖所示的例子
【算法練習(xí)Day51】柱狀圖中最大的矩形,練題,算法

當(dāng)我們遍歷到height[5]時(shí),因?yàn)闂m數(shù)綏5资菑拇蟮叫。琱eight[5]高度是小于棧頂元素的,所以就找到了此時(shí)的棧頂元素的左右第一個(gè)小于的柱子

【算法練習(xí)Day51】柱狀圖中最大的矩形,練題,算法

此時(shí)大家應(yīng)該可以發(fā)現(xiàn)其實(shí)就是棧頂和棧頂?shù)南乱粋€(gè)元素以及要入棧的三個(gè)元素組成了我們要求最大面積的高度和寬度

剩下就是分析清楚如下三種情況:

情況一:當(dāng)前遍歷的元素heights[i]小于棧頂元素heights[st.top()]的情況
情況二:當(dāng)前遍歷的元素heights[i]等于棧頂元素heights[st.top()]的情況
情況三:當(dāng)前遍歷的元素heights[i]大于棧頂元素heights[st.top()]的情況
完整代碼:

public int largestRectangleArea(int[] heights) {
    Deque<Integer> stack = new LinkedList<>();
    // 數(shù)組擴(kuò)容,在頭和尾各加入一個(gè)元素
    int [] newHeights = new int[heights.length + 2];
    newHeights[0] = 0;
    newHeights[newHeights.length - 1] = 0;
    for (int index = 0; index < heights.length; index++){
        newHeights[index + 1] = heights[index];
    }

    // 之后就用newHeights計(jì)算
    stack.push(0);
    int res = 0;
    // 第一個(gè)元素已經(jīng)入棧,從下標(biāo)1開始
    for (int i = 1; i < newHeights.length; i++) {
        if (newHeights[i] > newHeights[stack.peek()]) {
            stack.push(i);
        }else if (newHeights[i] == newHeights[stack.peek()]) {
            stack.pop();
            stack.push(i);
        }else {
            // 我們要找到一個(gè)不小于newHeights[i]為止
            while (newHeights[i] < newHeights[stack.peek()]) {
                int mid = stack.peek(); // 中間柱子
                stack.pop();
                int left = stack.peek();
                int right = i;
                int w = right - left - 1;
                int h = newHeights[mid];
                res = Math.max(res, w * h);
            }
            stack.push(i);
        }
    }

    return res;
}

總結(jié):

今天我們完成了柱狀圖中最大的矩形這道題,相關(guān)的思想需要多復(fù)習(xí)回顧。接下來,我們繼續(xù)進(jìn)行算法練習(xí)。希望我的文章和講解能對(duì)大家的學(xué)習(xí)提供一些幫助。

當(dāng)然,本文仍有許多不足之處,歡迎各位小伙伴們隨時(shí)私信交流、批評(píng)指正!我們下期見~

【算法練習(xí)Day51】柱狀圖中最大的矩形,練題,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-814026.html

到了這里,關(guān)于【算法練習(xí)Day51】柱狀圖中最大的矩形的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(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)文章

  • ● 84.柱狀圖中最大的矩形

    ?84.柱狀圖中最大的矩形

    2024年02月11日
    瀏覽(20)
  • LeetCode 84. 柱狀圖中最大的矩形

    LeetCode 84. 柱狀圖中最大的矩形

    84. 柱狀圖中最大的矩形 給定?n?個(gè)非負(fù)整數(shù),用來表示柱狀圖中各個(gè)柱子的高度。每個(gè)柱子彼此相鄰,且寬度為 1 。 求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。 示例 1: 輸入: heights = [2,1,5,6,2,3] 輸出: 10 解釋: 最大的矩形為圖中紅色區(qū)域,面積為 10 示例 2: 輸入

    2024年02月03日
    瀏覽(29)
  • (力扣記錄)84. 柱狀圖中最大的矩形

    數(shù)據(jù)結(jié)構(gòu)類型: 棧 時(shí)間復(fù)雜度: O(N) 空間復(fù)雜度: O(N) 代碼實(shí)現(xiàn):

    2024年01月20日
    瀏覽(25)
  • 【力扣】84. 柱狀圖中最大的矩形 <模擬、雙指針、單調(diào)棧>

    【力扣】84. 柱狀圖中最大的矩形 <模擬、雙指針、單調(diào)棧>

    給定 n 個(gè)非負(fù)整數(shù),用來表示柱狀圖中各個(gè)柱子的高度。每個(gè)柱子彼此相鄰,且寬度為 1 。求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。 示例 1: 輸入:heights = [2,1,5,6,2,3] 輸出:10 解釋:最大的矩形為圖中紅色區(qū)域,面積為 10 示例 2: 輸入: heights = [2,4] 輸出: 4 提示

    2024年02月12日
    瀏覽(16)
  • 吃透單調(diào)棧(2)——解兩道Hard題:接雨水、柱狀圖中最大的矩形問題

    吃透單調(diào)棧(2)——解兩道Hard題:接雨水、柱狀圖中最大的矩形問題

    這類題目的數(shù)據(jù)通常是一維數(shù)組,要尋找任一個(gè)元素的 右邊或者左邊 第一個(gè) 比自己 大 或者 小 的元素的位置(尋找 邊界 ) ,此時(shí)我們就要想到可以用單調(diào)棧了。 ? 這道題就是要求解每一個(gè)柱子左邊第一個(gè)比它高的柱子,以及右邊第一個(gè)比它高的柱子,然后這兩個(gè)柱子間

    2024年02月10日
    瀏覽(16)
  • LeetCode熱題HOT100:76. 最小覆蓋子串,84.柱狀圖中最大的矩形、96. 不同的二叉搜索樹

    LeetCode熱題HOT100:76. 最小覆蓋子串,84.柱狀圖中最大的矩形、96. 不同的二叉搜索樹

    題目 :給你一個(gè)字符串 s 、一個(gè)字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串,則返回空字符串 “” 。 注意: 對(duì)于 t 中重復(fù)字符,我們尋找的子字符串中該字符數(shù)量必須不少于 t 中該字符數(shù)量。 如果 s 中存在這樣的子串,我們保

    2023年04月19日
    瀏覽(31)
  • Rust每日一練(Leetday0029) 柱狀圖、最大矩形、擾亂字符串

    Rust每日一練(Leetday0029) 柱狀圖、最大矩形、擾亂字符串

    目錄 84. 柱狀圖中最大的矩形 Largest-rectangle-in-histogram???????? 85. 最大矩形 Maximal Rectangle???????? 87. 擾亂字符串 Scramble String???????? ?? 每日一練刷題專欄??? Rust每日一練 專欄 Golang每日一練 專欄 Python每日一練 專欄 C/C++每日一練 專欄 Java每日一練 專欄 給定? n

    2024年02月09日
    瀏覽(30)
  • 每天一道算法練習(xí)題--Day22&& 第一章 --算法專題 --- ----------最大公約數(shù)

    每天一道算法練習(xí)題--Day22&& 第一章 --算法專題 --- ----------最大公約數(shù)

    關(guān)于最大公約數(shù)有專門的研究。 而在 LeetCode 中雖然沒有直接讓你求解最大公約數(shù)的題目。但是卻有一些間接需要你求解最大公約數(shù)的題目。 時(shí)間復(fù)雜度:最好的情況是執(zhí)行一次循環(huán)體,最壞的情況是循環(huán)到 smaller 為 1,因此總的時(shí)間復(fù)雜度為 O ( N ) O(N) O ( N ) ,其中 N 為 a 和

    2024年02月03日
    瀏覽(22)
  • 【算法奧義】最大矩形問題

    【算法奧義】最大矩形問題

    下面展示 cpp代碼 。

    2024年02月10日
    瀏覽(17)
  • 面試算法40:矩陣中的最大矩形

    面試算法40:矩陣中的最大矩形

    請(qǐng)?jiān)谝粋€(gè)由0、1組成的矩陣中找出最大的只包含1的矩形并輸出它的面積。例如,在圖6.6的矩陣中,最大的只包含1的矩陣如陰影部分所示,它的面積是6。 直方圖是由排列在同一基線上的相鄰柱子組成的圖形。由于題目要求矩形中只包含數(shù)字1,因此將矩陣中上下相鄰的值為1的

    2024年02月06日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包