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

 

 

 

看到一篇博客,用的是stack解法,【LeetCode】84. Largest Rectangle in Histogram

先求出每个不递减可以达到的最大值,再把分立的这些不递减的序列合并,这部分可以先用stack构造出完整的不递减序列

 

import java.util.Stack;

public class Solution {
    public int largestRectangleArea(int[] heights) {
        
    	Stack<Integer> stack = new Stack<Integer>();
    	int max = 0, cnt = 0;
    	
    	for(int i=0; i<heights.length; i++) {
    		if(stack.isEmpty() || stack.peek() <= heights[i]) {
    			stack.push(heights[i]);
    		}
    		else {
    			
    			// 求出局部不递减序列的最大矩形面积
    			cnt = 0;
    			while(!stack.isEmpty() && stack.peek() > heights[i]) {
    				cnt ++;
    				max = Math.max(max, stack.pop()*cnt);
    			}
    			
    			// 把大于当前的出栈,构造不递减序列
    			while(cnt >= 0) {
    				stack.push(heights[i]);
    				cnt --;
    			}
    		}
    	}
    	
    	// 求出全局可合并的最大面积
    	int len = 1;
    	while(!stack.isEmpty()) {
    		max = Math.max(max, stack.pop()*len);
    		len ++;
    	}
    	
    	return max;
    }
}

https://www.geeksforgeeks.org/largest-rectangle-under-histogram/

考虑当前index为选取的区间最短的情况

package l84;

import java.util.Stack;

class Solution {
    public int largestRectangleArea(int[] height) {
        Stack<Integer>st=new Stack<Integer>();
        int res = 0;
        int[]a = new int[height.length+1];
        for(int i=0;i<height.length;i++)a[i]=height[i];
        a[height.length]=0;
        
        for(int i=0; i<a.length; i++) {
    		while(!st.isEmpty() && a[st.peek()]>=a[i]) {
    			int idx = st.pop();
    			int width = i-(st.isEmpty()?-1:st.peek())-1;
    			res = Math.max(res, a[idx]*width);
    		}
    		st.add(i);
        }
        
        return res;
    }
    
    public static void main(String[] args) {
		Solution s=new Solution();
		System.out.println(s.largestRectangleArea(new int[]{2,1,5,6,2,3}));
		System.out.println(s.largestRectangleArea(new int[]{1}));
	}
}

 

 

 

类似的用stack求解的如: 32. Longest Valid Parentheses

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值