zoukankan      html  css  js  c++  java
  • 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.

    思路:此题还是有一些难度的。刚開始想的双指针,前后扫描,可是每次求最小的高度的时候都须要遍历一次。效率上不是非常高。为o(n2)。

    代码例如以下:

    public class Solution {
        public int largestRectangleArea(int[] height) {
        	
            int max = 0;//最大值
            int i = 0;//左指针
            int j = height.length - 1;//右指针
            boolean isMinChange = true;
    
            //双指针扫描
            while(i <= j){
            	int minHeight = Integer.MAX_VALUE;//范围内最小值
            	if(isMinChange){//最小值是否改变
            		isMinChange = false;
            		//又一次得到最小值
            		for(int k = i ; k <= j;k++){
                        if(height[k] < minHeight){
                            minHeight = height[k];
                        }
                    }
            	}
            	//面积
                int area = (j - i + 1)*minHeight;
                if(max < area){
                    max = area;
                }
                if(i == j){//假设相等,则结束
                	break;
                }
                if(height[i] < height[j]){//左指针添加,直到比当前大
                	int k = i;
                	while(k <= j && height[k] <= height[i]){
                		if(height[k] == minHeight){//推断最小值是否改变
                			isMinChange = true;
                		}
                		k++;
                	}
                    i = k;
                }else{//右指针减小,直到比当前大
                	int k = j;
                	while( k >= i && height[k] <= height[j]){
                		if(height[k] == minHeight){//推断最小值是否改变
                			isMinChange = true;
                		}
                		k--;
                	}
                	j = k;	
                }
            } 
            return max;
        }
    }


    解法上过不了OJ,所以仅仅能在网上參看资料,最后找到资料例如以下,是用栈解决的。

    public class Solution {
        public int largestRectangleArea(int[] height) {
        	if (height == null || height.length == 0) return 0;
        	
            Stack<Integer> stHeight = new Stack<Integer>();
            Stack<Integer> stIndex = new Stack<Integer>();
            int max = 0;
            
            for(int i = 0; i < height.length; i++){
                if(stHeight.isEmpty() || height[i] > stHeight.peek()){
                    stHeight.push(height[i]);
                    stIndex.push(i);
                }else if(height[i] < stHeight.peek()){
                	int lastIndex = 0;
                	while(!stHeight.isEmpty() && height[i] < stHeight.peek()){
                		lastIndex = stIndex.pop();
                		int area = stHeight.pop()*(i - lastIndex);
                		if(max < area){
                			max = area;
                		}
                	}
                	stHeight.push(height[i]);
                	stIndex.push(lastIndex);
                }
            }
            while(!stHeight.isEmpty()){
            	int area = stHeight.pop()*(height.length - stIndex.pop());
            	max = max < area ? area:max;
            }
    
    		return max;
        }
    }


  • 相关阅读:
    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
    便携版WinSCP在命令行下同步文件夹
    ffmpeg (ffprobe)分析文件关键帧时间点
    sqlite删除数据或者表后,回收数据库文件大小
    ubuntu 20.04下 freeswitch 配合 fail2ban 防恶意访问
    ffmpeg使用nvenc编码的结论记录
    PC版跑跑卡丁车 故事模式 亚瑟传说章节 卡美洛庆典 2阶段 心灵之眼 攻略
    There was an error loading or playing the video
    Nvidia RTX Voice 启动报错修复方法
    火狐浏览器 关闭跨域限制
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7228822.html
Copyright © 2011-2022 走看看