摘要:題目要求即找到圖中可以組合而成的面積最大的矩形。從而我們可以知道該矩形在水平方向上的最大擴(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ū)別的。
最直觀的思路也就是從當(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思路三:利用已有數(shù)據(jù)刪減遍歷stack = new LinkedList (); for(int i = 0 ; i tempHeight){ 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; }
這里我們延續(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
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...
摘要:以此類推,如果一直到棧為空時(shí),說明剛出來的豎條之前的所有豎條都比它自己高,不然不可能棧為空,那我們以左邊全部的寬度作為長方形的寬度。 Largest Rectangle in Histogram Given n non-negative integers representing the histograms bar height where the width of each bar...
摘要:要求一個(gè)矩形的面積,要知道高和寬。如果每次確定高度為然后調(diào)用一個(gè)找到左右邊界,即不小于的最左和最右。這是一個(gè)明顯的算法,每次掃描都會重走整個(gè)。一個(gè)遞增序列這種,我們知道可以夠成的矩形是會不斷增大的。遞增序列預(yù)處理,遞減的時(shí)候計(jì)算。 showImg(https://segmentfault.com/img/bVoQel); For example, Given heights = [2,...
摘要:而最大的矩形一定滿足兩個(gè)邊界的高度小于該矩形的高度這個(gè)條件如果不滿足的話,邊界也可以被添加進(jìn)來計(jì)算而不破壞矩形的形狀,此時(shí)不為最大,因此找出所有這樣的矩形就一定可以在其中找出面積最大的矩形。 Problem Given n non-negative integers representing the histograms bar height where the width of e...
摘要:只要出現(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 ...
閱讀 3486·2021-10-18 13:30
閱讀 2941·2021-10-09 09:44
閱讀 1964·2019-08-30 11:26
閱讀 2287·2019-08-29 13:17
閱讀 757·2019-08-29 12:17
閱讀 2246·2019-08-26 18:42
閱讀 471·2019-08-26 13:24
閱讀 2951·2019-08-26 11:39