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

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

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

【力扣】84. 柱狀圖中最大的矩形

給定 n 個(gè)非負(fù)整數(shù),用來表示柱狀圖中各個(gè)柱子的高度。每個(gè)柱子彼此相鄰,且寬度為 1 。求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

示例 1:
【力扣】84. 柱狀圖中最大的矩形 <模擬、雙指針、單調(diào)棧>,力扣及OJ,# 棧、隊(duì)列、單調(diào)棧,# 雙指針,leetcode,java,算法

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

示例 2:
【力扣】84. 柱狀圖中最大的矩形 <模擬、雙指針、單調(diào)棧>,力扣及OJ,# 棧、隊(duì)列、單調(diào)棧,# 雙指針,leetcode,java,算法

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

提示:
1 <= heights.length <= 1 0 5 10^5 105
0 <= heights[i] <= 1 0 4 10^4 104

題解

暴力求解
public static int largestRectangleArea(int[] heights) {
    int sum = 0;
    for (int i = 0; i < heights.length; i++) {
        int left = i;
        int right = i;

        //找當(dāng)前遍歷元素之前第一個(gè)比它小的元素
        while (left >= 0) {
            if (heights[left] < heights[i]) {
                break;
            }
            left--;
        }

        //找當(dāng)前遍歷元素之后第一個(gè)比它小的元素
        while (right < heights.length) {
            if (heights[right] < heights[i]) {
                break;
            }
            right++;
        }

        int w = right - left - 1;
        int h = heights[i];
        sum = Math.max(sum, w * h);
    }
    return sum;
}
雙指針
public class Solution {
    public static int largestRectangleArea(int[] heights) {
        int[] minLeftIndex = new int[heights.length];
        int[] minRightIndex = new int[heights.length];


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


        // 記錄每個(gè)柱子右邊第一個(gè)小于該柱子的下標(biāo)
        minRightIndex[heights.length - 1] = heights.length;
        for (int i = heights.length - 2; i >= 0; i--) {
            int t = i + 1;
            while (t < heights.length && heights[t] >= heights[i]) {
                t = minRightIndex[t];
            }
            minRightIndex[i] = t;
        }

        /*for (int a : minLeftIndex) {
            System.out.println(a);
        }
        System.out.println("______________________________");

        for (int a : minRightIndex) {
            System.out.println(a);
        }*/

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

    public static void main(String[] args) {
        int[] heights = {2, 4, 2};
        System.out.println(largestRectangleArea(heights));
    }
}
單調(diào)棧

注意:?jiǎn)握{(diào)棧是遞減的文章來源地址http://www.zghlxwxcb.cn/news/detail-661359.html

class Solution {
    int largestRectangleArea(int[] heights) {
        Stack<Integer> st = new Stack<Integer>();
        
        // 數(shù)組擴(kuò)容,在頭和尾各加入一個(gè)元素,防止只遞增或者只遞減的數(shù)組
        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];
        }

        heights = newHeights;
        
        st.push(0);
        int result = 0;
        // 第一個(gè)元素已經(jīng)入棧,從下標(biāo)1開始
        for (int i = 1; i < heights.length; i++) {
            // 注意heights[i] 是和heights[st.top()] 比較 ,st.top()是下標(biāo)
            if (heights[i] > heights[st.peek()]) {
                st.push(i);
            } else if (heights[i] == heights[st.peek()]) {
                st.pop(); // 這個(gè)可以加,可以不加,效果一樣,思路不同
                st.push(i);
            } else {
                while (heights[i] < heights[st.peek()]) { // 注意是while
                    int mid = st.peek();
                    st.pop();
                    int left = st.peek();
                    int right = i;
                    int w = right - left - 1;
                    int h = heights[mid];
                    result = Math.max(result, w * h);
                }
                st.push(i);
            }
        }
        return result;
    }
}

到了這里,關(guān)于【力扣】84. 柱狀圖中最大的矩形 <模擬、雙指針、單調(diào)棧>的文章就介紹完了。如果您還想了解更多內(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)文章

  • 算法leetcode|84. 柱狀圖中最大的矩形(rust重拳出擊)

    算法leetcode|84. 柱狀圖中最大的矩形(rust重拳出擊)

    給定 n 個(gè)非負(fù)整數(shù),用來表示柱狀圖中各個(gè)柱子的高度。每個(gè)柱子彼此相鄰,且寬度為 1 。 求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。 1 = heights.length =10 5 0 = heights[i] = 10 4 面對(duì)這道算法題目,二當(dāng)家的再次陷入了沉思。 眼睛一看似乎有思路,但是一動(dòng)手就容易不知

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

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

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

    2024年02月10日
    瀏覽(17)
  • 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)
  • 【算法練習(xí)Day51】柱狀圖中最大的矩形

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

    ???個(gè)人主頁(yè):@Sherry的成長(zhǎng)之路 ??學(xué)習(xí)社區(qū):Sherry的成長(zhǎng)之路(個(gè)人社區(qū)) ??專欄鏈接:練題 ?? 長(zhǎng)路漫漫浩浩,萬事皆有期待 力扣題目鏈接 給定 n 個(gè)非負(fù)整數(shù),用來表示柱狀圖中各個(gè)柱子的高度。每個(gè)柱子彼此相鄰,且寬度為 1 。 求在該柱狀圖中,能夠勾勒出來的矩

    2024年01月22日
    瀏覽(23)
  • OJ練習(xí)第101題——柱狀圖中最大的矩形

    OJ練習(xí)第101題——柱狀圖中最大的矩形

    力扣鏈接:84. 柱狀圖中最大的矩形 給定 n 個(gè)非負(fù)整數(shù),用來表示柱狀圖中各個(gè)柱子的高度。每個(gè)柱子彼此相鄰,且寬度為 1 。 求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。 我們先嵌套一層 while 循環(huán)來向左找到第一個(gè)比柱體 i 高度小的柱體,這個(gè)過程是 O(N) 的; 單調(diào)

    2024年02月04日
    瀏覽(23)
  • 算法刷題Day 60 柱狀圖中的最大矩陣

    暴力解法 超時(shí)了 分別找出當(dāng)前位置左邊 第一個(gè) 比自己小的索引(的后一個(gè)位置)和右邊 第一個(gè) 比自己小的索引(的前一個(gè)位置),這個(gè)范圍之內(nèi),就是以當(dāng)前位置的高度所能達(dá)到的最大寬度。 單調(diào)棧 有了接雨水那道題的經(jīng)驗(yàn),這一道題可以模仿著做出了

    2024年02月14日
    瀏覽(21)
  • 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日
    瀏覽(31)
  • 【力扣】496. 下一個(gè)更大元素 I <單調(diào)棧、模擬>

    【力扣】496. 下一個(gè)更大元素 I <單調(diào)棧、模擬>

    ??nums1 中數(shù)字 x 的 下一個(gè)更大元素 是指 x 在 nums2 中對(duì)應(yīng)位置 右側(cè) 的 第一個(gè) 比 x 大的元素。給你兩個(gè)沒有重復(fù)元素的數(shù)組 nums1 和 nums2 ,下標(biāo)從 0 開始計(jì)數(shù),其中nums1 是 nums2 的子集。 ??對(duì)于每個(gè) 0 = i nums1.length ,找出滿足 nums1[i] == nums2[j] 的下標(biāo) j ,并且在 nums2 確定

    2024年02月12日
    瀏覽(29)
  • 單調(diào)棧練習(xí)(四)— 統(tǒng)計(jì)全 1 子矩形

    單調(diào)棧練習(xí)(四)— 統(tǒng)計(jì)全 1 子矩形

    題目 同樣的LeetCode原題:題目鏈接 給你一個(gè) m x n 的二進(jìn)制矩陣 mat ,請(qǐng)你返回有多少個(gè) 子矩形 的元素全部都是 1 。 單調(diào)棧 解題思路整體和上一篇文章差不多,都是用到了 壓縮數(shù)組 的技巧,通過壓縮數(shù)組來構(gòu)建一個(gè)數(shù)組矩陣、以每一行為底, 每一列作為矩陣的高度,區(qū)別

    2024年01月24日
    瀏覽(11)
  • Echarts—X軸鼠標(biāo)滑動(dòng)或者縮放/多列柱狀圖中某一列數(shù)據(jù)為0時(shí)不占位

    Echarts—X軸鼠標(biāo)滑動(dòng)或者縮放/多列柱狀圖中某一列數(shù)據(jù)為0時(shí)不占位

    用柱狀圖展示12個(gè)月的項(xiàng)目對(duì)應(yīng)的供應(yīng)商數(shù)據(jù); 每個(gè)月有多個(gè)項(xiàng)目不確定,1-50之間,也就是說,12個(gè)月,每個(gè)月的X軸上有不確定的柱狀;例如:1月有20根柱子,2月有5根柱子,3月有15根… 每月的每根柱子代表是一個(gè)項(xiàng)目,鼠標(biāo)移入每月的每一個(gè)項(xiàng)目的柱子上要懸浮展示該月該

    2024年02月09日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包