classSolution{publicintlargestRectangleArea(int[] heights){int res =0;// 單調棧:存儲 indexDeque<Integer> stack =newArrayDeque<>();// 前后添加0:處理邊界,讓heights[0], heights[len - 1] 都可以參與比較(參考恒遞增情況)int[] newHeights =newint[heights.length +2];for(int i =1; i < heights.length +1; i++){newHeights[i]= heights[i -1];}// O(n):遍歷新數組for(int i =0; i < newHeights.length; i++){// 棧不為空,且當前棧頂更大(出現遞減情況)時while(!stack.isEmpty()&& newHeights[stack.peek()]> newHeights[i]){int index = stack.pop();// 用于獲取當前高int l = stack.peek();// 獲取左邊第一個比當前列矮的下標int r = i;// 右邊第一個比當前列矮的下標// 計算:以stack.pop()為高,可行的最大矩形res =Math.max(res,(r - l -1)* newHeights[index]);}// 加入當前下標(此時保持遞增)stack.push(i);}return res;}}
無注釋版
classSolution{publicintlargestRectangleArea(int[] heights){int res =0;Deque<Integer> stack =newArrayDeque<>();int[] newHeights =newint[heights.length +2];for(int i =1; i < heights.length +1; i++){newHeights[i]= heights[i -1];}for(int i =0; i < newHeights.length; i++){while(!stack.isEmpty()&& newHeights[stack.peek()]> newHeights[i]){int index = stack.pop();int l = stack.peek();int r = i;res =Math.max(res,(r - l -1)* newHeights[index]);}stack.push(i);}return res;}}
二刷
單調棧,只能說 Dalao 思路還是強
classSolution{publicintlargestRectangleArea(int[] heights){int[] newHeights =newint[heights.length +2];for(int i =1; i <= heights.length; i++){newHeights[i]= heights[i -1];}Deque<Integer> stack =newArrayDeque<>();int max =0;for(int i =0; i < newHeights.length; i++){// 當前棧頂為最高列的可行值while(!stack.isEmpty()&& newHeights[i]< newHeights[stack.peek()]){int now = stack.poll();int left = stack.peek();// 左邊第一個比 now 對應值小的下標int right = i;// 當前即是右邊第一個比 now 對應值小的下標max =Math.max(max,(right - left -1)* newHeights[now]);// 維護 max}// 棧中比當前大的都去掉了,now 可以加入棧,并保持單調增了。stack.push(i);}return max;}}