国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

leetcode84. Largest Rectangle in Histogram

Harpsichord1207 / 1343人閱讀

摘要:題目要求即找到圖中可以組合而成的面積最大的矩形。從而我們可以知道該矩形在水平方向上的最大擴(kuò)展程度。也就是說,棧中數(shù)據(jù)記錄了最遠(yuǎn)左側(cè)下標(biāo),而當(dāng)前的矩形則是最遠(yuǎn)右側(cè)下標(biāo)。當(dāng)我們不采用數(shù)據(jù)結(jié)構(gòu)時(shí),尋找和計(jì)算的過程需要的時(shí)間復(fù)雜度。

題目要求
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 heights = [2,1,5,6,2,3],
return 10.

即找到圖中可以組合而成的面積最大的矩形。

這里我首先想到的是leetcode 42 Trapping Rain Water,可以參考我的這篇博客。
因?yàn)樵?2題中,如果我找到了當(dāng)前矩形左右的最近最高矩形即可。而在本題中,同樣是需要找到該矩形左右的最高矩形,但不同的是,一旦我在左右搜尋的過程中遇到了一個(gè)比當(dāng)前矩形矮的矩形,遍歷即結(jié)束。所以兩道題目的要求還是存在區(qū)別的。

思路一:直觀但超時(shí)

最直觀的思路也就是從當(dāng)前矩形出發(fā),分別向左向右遍歷,一旦遇到一個(gè)矩形比當(dāng)前矩形矮,則該方向的遍歷結(jié)束。從而我們可以知道該矩形在水平方向上的最大擴(kuò)展程度。代碼如下:

    public int largestRectangleArea(int[] heights) {
        int barCount = heights.length;
        
        int max = 0;
        for(int i = 0 ; i=0 && heights[j]>=tempHeight ; j--) tempWidth++;
            for(int j = i+1 ; j=tempHeight ; j++) tempWidth++;
            max = Math.max(max, tempWidth*tempHeight);
        }
        return max;
    }

當(dāng)然,該方法鑒于其需要O(n^2)的時(shí)間復(fù)雜度,再加上如果出現(xiàn)極端情況即每個(gè)矩形都可以水平擴(kuò)展至n長度,其中n等于數(shù)組的長度(例如[1,1,1,1,......,1],n=100000),這樣就會帶來很多無效的遍歷。

思路二:堆棧

如果我們按照順序從左往右遍歷,我們會返現(xiàn),一旦右邊的矩形比左邊矮,則左邊矩形的向右擴(kuò)展的程度直接由右邊矩形決定。那么我們?nèi)绾沃雷筮吘匦蔚淖筮厰U(kuò)展程度呢。這就需要我們采用棧的模式來記錄。一旦新遇到的矩形比棧頂元素矮,我們需要逐個(gè)排出棧元素直到棧頂元素大于當(dāng)前矩形高度。同時(shí)我們還需要將當(dāng)前矩形的數(shù)據(jù)壓入棧中,而當(dāng)前矩形的左邊距則由排出的最后元素的下標(biāo)決定。也就是說,棧中數(shù)據(jù)記錄了最遠(yuǎn)左側(cè)下標(biāo),而當(dāng)前的矩形則是最遠(yuǎn)右側(cè)下標(biāo)。代碼如下:

    public int largestRectangleArea2(int[] heights){
        int barCount = heights.length;
        int max = 0;
        LinkedList stack = new LinkedList();
        for(int i = 0 ; itempHeight){
                lastIndex = stack.pop();
                max = Math.max(max, (i-lastIndex)*heights[lastIndex]);
                heights[lastIndex] =tempHeight; 
            }
            stack.push(lastIndex);
        }
        while(!stack.isEmpty()){
            int currentIndex = stack.pop();
            max = Math.max(max, (barCount-currentIndex)*heights[currentIndex]);
        }
        return max;
    }
思路三:利用已有數(shù)據(jù)刪減遍歷

這里我們延續(xù)一種的思路,還是采用找到當(dāng)前矩形的最遠(yuǎn)左右側(cè)下標(biāo),不同的是,我們用兩個(gè)數(shù)據(jù)結(jié)構(gòu)int[] lessFromLeft, int[] lessFromRight分別來存儲當(dāng)前矩形的最遠(yuǎn)左右側(cè)下標(biāo)。當(dāng)我們不采用數(shù)據(jù)結(jié)構(gòu)時(shí),尋找和計(jì)算的過程需要O(n^2)的時(shí)間復(fù)雜度。而通過數(shù)據(jù)結(jié)構(gòu),我們可以很大程度上減少遍歷次數(shù),對當(dāng)前矩陣的最左側(cè)下標(biāo)可以通過lessFromLeft跳躍遍歷。也就是說,如果左側(cè)矩形比當(dāng)前矩形大,則跳到左側(cè)矩形的最左側(cè)矩形繼續(xù)判斷,如果最后調(diào)到起點(diǎn),則結(jié)束遍歷。

代碼如下:

    public int largestRectangleArea3(int[] heights){
        int barCount = heights.length;
        if(barCount==0) return 0;
        int[] lessThanLeft = new int[barCount];
        int[] lessThanRight = new int[barCount];
        lessThanLeft[0] = -1;
        lessThanRight[barCount-1] = barCount;
        for(int i = 1 ; i=0 && heights[p]>=heights[i]){
                p = lessThanLeft[p];
            }
            lessThanLeft[i] = p;
        }
        for(int i = barCount-2 ; i>=0 ; i--){
            int p = i+1;
            while(p=heights[i]) p = lessThanRight[p];
            lessThanRight[i] = p;
        }
        
        int max = 0;
        for(int i = 0 ; i


想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號!將會不定期的發(fā)放福利哦~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67424.html

相關(guān)文章

  • [LeetCode] 84. Largest Rectangle in Histogram

    Problem Given n non-negative integers representing the histograms bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. showImg(https://segmentfault.com/img...

    BaronZhang 評論0 收藏0
  • [Leetcode] Largest Rectangle (in Histogram) 最大矩形

    摘要:以此類推,如果一直到棧為空時(shí),說明剛出來的豎條之前的所有豎條都比它自己高,不然不可能棧為空,那我們以左邊全部的寬度作為長方形的寬度。 Largest Rectangle in Histogram Given n non-negative integers representing the histograms bar height where the width of each bar...

    鄒強(qiáng) 評論0 收藏0
  • 84. Largest Rectangle in Histogram

    摘要:要求一個(gè)矩形的面積,要知道高和寬。如果每次確定高度為然后調(diào)用一個(gè)找到左右邊界,即不小于的最左和最右。這是一個(gè)明顯的算法,每次掃描都會重走整個(gè)。一個(gè)遞增序列這種,我們知道可以夠成的矩形是會不斷增大的。遞增序列預(yù)處理,遞減的時(shí)候計(jì)算。 showImg(https://segmentfault.com/img/bVoQel); For example, Given heights = [2,...

    melody_lql 評論0 收藏0
  • Largest Rectangle in Histogram

    摘要:而最大的矩形一定滿足兩個(gè)邊界的高度小于該矩形的高度這個(gè)條件如果不滿足的話,邊界也可以被添加進(jìn)來計(jì)算而不破壞矩形的形狀,此時(shí)不為最大,因此找出所有這樣的矩形就一定可以在其中找出面積最大的矩形。 Problem Given n non-negative integers representing the histograms bar height where the width of e...

    vvpvvp 評論0 收藏0
  • [LintCode] Largest Rectangle in Histogram

    摘要:只要出現(xiàn)當(dāng)前右邊界高度小于等于棧頂元素高度的情況,就取出棧頂元素當(dāng)前遍歷過最高的并對這個(gè)元素進(jìn)行取最大矩形的運(yùn)算。 Problem Given n non-negative integers representing the histograms bar height where the width of each bar is 1, find the area of largest ...

    alighters 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<