LeetCode 84 & Poj 2559 & hdu 1506 求柱状图中最大的矩形

栏目: 编程工具 · 发布时间: 6年前

内容简介:起初这题想了半天,然后瞄到一眼leetcode边上相关话题是"栈"....于是就想到用栈了.(尴尬) 这题若是从两个方向上分别来一次循环也是可以的(单调性),用了栈可以将两次循环合并(相当于剪枝). 用栈起初是没问题,但是我遇到了如 2,1,2 的情况时我就卡主了(当时我没有想到把出栈的数据改值重新入栈).然后参考了下网上其他人的思路才发现还能再压回去.流程图 (从CSDN转来的流程图代码,掘金没有流程图生成功能...附上图片):

Poj 2559 Largest Rectangle in a Histogram

LeetCode 84 & Poj 2559 & hdu 1506 求柱状图中最大的矩形
LeetCode 84 柱状图中最大的矩形
LeetCode 84 & Poj 2559 & hdu 1506 求柱状图中最大的矩形
hdu 1506 Largest Rectangle in a Histogram

起初这题想了半天,然后瞄到一眼leetcode边上相关话题是"栈"....于是就想到用栈了.(尴尬) 这题若是从两个方向上分别来一次循环也是可以的(单调性),用了栈可以将两次循环合并(相当于剪枝). 用栈起初是没问题,但是我遇到了如 2,1,2 的情况时我就卡主了(当时我没有想到把出栈的数据改值重新入栈).然后参考了下网上其他人的思路才发现还能再压回去.

流程图 (从CSDN转来的流程图代码,掘金没有流程图生成功能...附上图片):

flowchat
st=>start: i=0
e=>end: 结束
putIn=>operation: i直接入栈
putOut=>operation: 出栈,具体操作见代码
iPlus=>operation: i++
ifEmpty=>condition: 是否空栈
ifSmaller=>condition: h[i]小于栈顶元素?
iEnd=>condition: i>length?

st->ifEmpty
ifEmpty(yes)->putIn
ifEmpty(no)->ifSmaller
putIn->iPlus
ifSmaller(yes)->putOut
ifSmaller(no)->putIn
putOut->iPlus
iPlus->iEnd
iEnd(yes)->e
iEnd(no)->ifEmpty
复制代码
LeetCode 84 & Poj 2559 & hdu 1506 求柱状图中最大的矩形

JAVA代码 (LeetCode版本)

/**
     * 遍历数组
     * 1.栈为空则入栈
     * 2.若h[i]>=栈顶元素,入栈
     * 3.若h[i]<栈顶元素,则开始出栈计算面积,并将最后出栈的h[x]值改为h[i]再重新入栈
     *
     * @param heights 数组,本例会创建个新数组,在数组最后一个位置补个高度为0的图
     * @return 最大面积值
     */
    public int largestRectangleArea(int[] heights) {
        int max = 0;
        Stack<Integer> s = new Stack<>();
        int[] h = new int[heights.length + 1];
        for (int i = 0; i < h.length; i++) {
            h[i] = i == heights.length ? 0 : heights[i];
            if (s.empty()) {
                //空栈直接入栈
                s.push(i);
                continue;
            }
            if (h[i] < h[s.peek()]) {
                //遇到小于栈顶的值,开始出栈,查找最大面积
                int top = 0;
                while (!s.empty() && h[s.peek()] > h[i]) {
                    top = s.pop();
                    max = Math.max((i - top) * h[top], max);
                }
                //将最后出栈的高度改为h[i]重新入栈
                h[top] = h[i];
                s.push(top);
                s.push(i);
            } else {
                s.push(i);
            }
        }
        return max;
    }
复制代码

Poj & hdu 版本 ps: poj&hdu的数据量要大一点,得使用long.

import java.util.Scanner;
import java.util.Stack;

public class Main {

    /**
     * 遍历数组
     * 1.栈为空则入栈
     * 2.若h[i]>=栈顶元素,入栈
     * 3.若h[i]<栈顶元素,则开始出栈计算面积,并将最后出栈的h[x]值改为h[i]再重新入栈
     *
     * @param heights 数组,本例会创建个新数组,在数组最后一个位置补个高度为0的图
     * @return 最大面积值
     */
    public long largestRectangleArea(int[] heights) {
        long max = 0;
        Stack<Integer> s = new Stack<Integer>();
        int[] h = new int[heights.length + 1];
        for (int i = 0; i < h.length; i++) {
            h[i] = i == heights.length ? 0 : heights[i];
            if (s.empty()) {
                //空栈直接入栈
                s.push(i);
                continue;
            }
            if (h[i] < h[s.peek()]) {
                //遇到小于栈顶的值,开始出栈,查找最大面积
                int top = 0;
                while (!s.empty() && h[s.peek()] > h[i]) {
                    top = s.pop();
                    max = Math.max((i - top) * (long)h[top], max);
                }
                //将最后出栈的高度改为h[i]重新入栈
                h[top] = h[i];
                s.push(top);
                s.push(i);
            } else {
                s.push(i);
            }
        }
        return max;
    }

    public static void main(String[] args) {
        Main n84 = new Main();
//        System.out.println(n84.largestRectangleArea(new int[]{1,2,3,2,1,5,6,2,3,2,2}));
        // oj summit version
        Scanner scan = new Scanner(System.in);
        int n;
        while ((n = scan.nextInt()) != 0) {
            int[] array = new int[n];
            for (int i = 0; i < n; i++) {
                array[i] = scan.nextInt();
            }
            System.out.println(n84.largestRectangleArea(array));
        }
    }
}
复制代码

以上所述就是小编给大家介绍的《LeetCode 84 & Poj 2559 & hdu 1506 求柱状图中最大的矩形》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

腾讯方法

腾讯方法

潘东燕、王晓明 / 机械工业出版社 / 2014-12-11 / 39.00

这是国内第一本深度讲述腾讯产品研发与团队转型的书。本书介绍了腾讯三个不同生命周期的产品的开发过程,包括如何踏足新领域开发新产品;如何救活一个即将半路夭折的产品;如何让一个老产品持续盈利。本书呈现了互联网产品开发时会遇到普遍问题和解决方法,涉及大企业如何内部创业,并迅速组建新的项目团队;如何实现跨部门的合作;在面临新团队和紧急开发任务时如何提高团队沟通效率;在产品研发方面,如何定位产品、如何敏捷开发......一起来看看 《腾讯方法》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试