最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形)

 更新時(shí)間:2021年07月12日 14:29:31   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 84. Largest Rectangle in Histogram 直方圖中最大的矩形

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

The largest rectangle is shown in the shaded area, which has area = 10 unit.

For example,
Given height = [2,1,5,6,2,3],
return 10.

這道題讓求直方圖中最大的矩形,剛開(kāi)始看到求極值問(wèn)題以為要用DP來(lái)做,可是想不出遞推式,只得作罷。這道題如果用暴力搜索法估計(jì)肯定沒(méi)法通過(guò)OJ,有一種很好的優(yōu)化方法,就是遍歷數(shù)組,每找到一個(gè)局部峰值(只要當(dāng)前的數(shù)字大于后面的一個(gè)數(shù)字,那么當(dāng)前數(shù)字就看作一個(gè)局部峰值,跟前面的數(shù)字大小無(wú)關(guān)),然后向前遍歷所有的值,算出共同的矩形面積,每次對(duì)比保留最大值。這里再說(shuō)下為啥要從局部峰值處理,看題目中的例子,局部峰值為 2,6,3,我們只需在這些局部峰值出進(jìn)行處理,為啥不用在非局部峰值處統(tǒng)計(jì)呢,這是因?yàn)榉蔷植糠逯堤幍那闆r,后面的局部峰值都可以包括,比如1和5,由于局部峰值6是高于1和5的,所有1和5能組成的矩形,到6這里都能組成,并且還可以加上6本身的一部分組成更大的矩形,那么就不用費(fèi)力氣去再統(tǒng)計(jì)一個(gè)1和5處能組成的矩形了。代碼如下:

解法一: 

// Pruning optimize
class Solution {
public:
    int largestRectangleArea(vector<int> &height) {
        int res = 0;
        for (int i = 0; i < height.size(); ++i) {
            if (i + 1 < height.size() && height[i] <= height[i + 1]) {
                continue;
            }
            int minH = height[i];
            for (int j = i; j >= 0; --j) {
                minH = min(minH, height[j]);
                int area = minH * (i - j + 1);
                res = max(res, area);
            }
        }
        return res;
    }
};

后來(lái)又在網(wǎng)上發(fā)現(xiàn)一種比較流行的解法,是利用棧來(lái)解,可參考其他文檔,但是經(jīng)過(guò)仔細(xì)研究,其核心思想跟上面那種剪枝的方法有異曲同工之妙,這里維護(hù)一個(gè)棧,用來(lái)保存遞增序列,相當(dāng)于上面那種方法的找局部峰值。我們可以看到,直方圖矩形面積要最大的話,需要盡可能的使得連續(xù)的矩形多,并且最低一塊的高度要高。有點(diǎn)像木桶原理一樣,總是最低的那塊板子決定桶的裝水量。那么既然需要用單調(diào)棧來(lái)做,首先要考慮到底用遞增棧,還是用遞減棧來(lái)做。我們想啊,遞增棧是維護(hù)遞增的順序,當(dāng)遇到小于棧頂元素的數(shù)就開(kāi)始處理,而遞減棧正好相反,維護(hù)遞減的順序,當(dāng)遇到大于棧頂元素的數(shù)開(kāi)始處理。那么根據(jù)這道題的特點(diǎn),我們需要按從高板子到低板子的順序處理,先處理最高的板子,寬度為1,然后再處理旁邊矮一些的板子,此時(shí)長(zhǎng)度為2,因?yàn)橹暗母甙遄涌山M成矮板子的矩形 ,因此我們需要一個(gè)遞增棧,當(dāng)遇到大的數(shù)字直接進(jìn)棧,而當(dāng)遇到小于棧頂元素的數(shù)字時(shí),就要取出棧頂元素進(jìn)行處理了,那取出的順序就是從高板子到矮板子了,于是乎遇到的較小的數(shù)字只是一個(gè)觸發(fā),表示現(xiàn)在需要開(kāi)始計(jì)算矩形面積了,為了使得最后一塊板子也被處理,這里用了個(gè)小 trick,在高度數(shù)組最后面加上一個(gè)0,這樣原先的最后一個(gè)板子也可以被處理了。由于棧頂元素是矩形的高度,那么關(guān)鍵就是求出來(lái)寬度,那么跟之前那道 Trapping Rain Water 一樣,單調(diào)棧中不能放高度,而是需要放坐標(biāo)。由于我們先取出棧中最高的板子,那么就可以先算出長(zhǎng)度為1的矩形面積了,然后再取下一個(gè)板子,此時(shí)根據(jù)矮板子的高度算長(zhǎng)度為2的矩形面積,以此類推,知道數(shù)字大于棧頂元素為止,再次進(jìn)棧,巧妙的一比!關(guān)于單調(diào)棧問(wèn)題可以參見(jiàn)博主的一篇總結(jié)帖 LeetCode Monotonous Stack Summary 單調(diào)棧小結(jié),代碼如下:

解法二: 

class Solution {
public:
    int largestRectangleArea(vector<int> &height) {
        int res = 0;
        stack<int> st;
        height.push_back(0);
        for (int i = 0; i < height.size(); ++i) {
            if (st.empty() || height[st.top()] < height[i]) {
                st.push(i);
            } else {
                int cur = st.top(); st.pop();
                res = max(res, height[cur] * (st.empty() ? i : (i - st.top() - 1)));
                --i;
            }     
        }
        return res;
    }
};

我們可以將上面的方法稍作修改,使其更加簡(jiǎn)潔一些:

解法三:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int res = 0;
        stack<int> st;
        heights.push_back(0);
        for (int i = 0; i < heights.size(); ++i) {
            while (!st.empty() && heights[st.top()] >= heights[i]) {
                int cur = st.top(); st.pop();
                res = max(res, heights[cur] * (st.empty() ? i : (i - st.top() - 1)));
            }
            st.push(i);
        }
        return res;
    }
};

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)直方圖中最大的矩形內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Matlab中自帶的Java操作合集

    詳解Matlab中自帶的Java操作合集

    其實(shí)Matlab中也有一些自帶的Java操作,例如:獲取鼠標(biāo)在全屏位置、獲取當(dāng)前剪切板內(nèi)容、獲取鼠標(biāo)處像素顏色等,本文總結(jié)了七個(gè)這樣的操作,感興趣的可以了解一下
    2022-03-03
  • C語(yǔ)言之預(yù)處理命令的深入講解

    C語(yǔ)言之預(yù)處理命令的深入講解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言之預(yù)處理命令的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C++中Covariant返回值類型詳解

    C++中Covariant返回值類型詳解

    這篇文章主要介紹了C++中Covariant返回值類型詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以可以參考一下
    2022-09-09
  • C++實(shí)現(xiàn)新年賀卡程序

    C++實(shí)現(xiàn)新年賀卡程序

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)賀卡程序,C++應(yīng)用程序編寫(xiě)的雪花賀卡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • C++中replace()函數(shù)使用方法匯總

    C++中replace()函數(shù)使用方法匯總

    這篇文章主要介紹了C++中replace()函數(shù)使用方法匯總,在這篇文章中為大家詳細(xì)介紹C++ replace()函數(shù)的各種應(yīng)用方式,希望朋友們可以從這里介紹的內(nèi)容充分掌握這一應(yīng)用技巧
    2015-11-11
  • C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù)

    C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù)

    這篇文章主要介紹了C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C# interface與delegate效能比較的深入解析

    C# interface與delegate效能比較的深入解析

    本篇文章是對(duì)C#中interface與delegate的效能比較進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言詳細(xì)實(shí)現(xiàn)猜拳游戲流程

    C語(yǔ)言詳細(xì)實(shí)現(xiàn)猜拳游戲流程

    在學(xué)習(xí)了循環(huán)、分支、和函數(shù)之后,可以寫(xiě)一些簡(jiǎn)單的小游戲來(lái)給自己的編程之路增添一份樂(lè)趣。不僅提升了編碼能力,還可以邊學(xué)邊玩,簡(jiǎn)直妙哉妙哉
    2022-05-05
  • 如何基于C++解決RTSP取流報(bào)錯(cuò)問(wèn)題

    如何基于C++解決RTSP取流報(bào)錯(cuò)問(wèn)題

    這篇文章主要介紹了如何基于C++解決RTSP取流報(bào)錯(cuò)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Qt讀取Json文件的方法詳解(含源碼+注釋)

    Qt讀取Json文件的方法詳解(含源碼+注釋)

    QT本身就有讀取json的接口,簡(jiǎn)單又方便,下面這篇文章主要給大家介紹了關(guān)于Qt讀取Json文件(含源碼+注釋)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10

最新評(píng)論

黔西县| 和硕县| 焉耆| 武安市| 马公市| 石首市| 孟连| 永昌县| 溧阳市| 信宜市| 云和县| 南投县| 郁南县| 霞浦县| 大连市| 郎溪县| 公安县| 松江区| 昌吉市| 财经| 攀枝花市| 长治县| 滦南县| 兴仁县| 油尖旺区| 区。| 芦溪县| 上虞市| 定结县| 上虞市| 剑河县| 东辽县| 富顺县| 桂林市| 嘉禾县| 绵阳市| 宁远县| 古丈县| 万年县| 炎陵县| 济源市|