九章算法面试题43 直方图内最大矩阵

九章算法官网-原文网址

http://www.jiuzhang.com/problem/43/


题目

给出一个直方图(如图所示),求出所给直方图中所包含的最大矩阵面积。直方图可以用一个整数数组表示,如上图为[2, 1, 5, 6, 2, 3]。每个直方块的宽度均为1。上图中包含的最大矩阵面积为10.

九章算法面试题43 直方图内最大矩阵_第1张图片




解答

如果对于每个直方块,找到从它开始往左边数第一个比它小的,和往右边数第一个比他小的,则可以确定出以该直方块为最矮一块的矩阵的最大面积。使用数据结构栈,栈中保存递增序列,从左到右依次遍历每个数让其入栈,入栈之前先pop出所有>=该数的数,从而保持栈中的递增序列。pop完之后的栈顶元素即为该数往左边数第一个比他小的数。同理反过来遍历一次可以得到往右边数第一个比他小的数。时间复杂度O(n),空间复杂度O(n)


面试官角度

计算每个数往左或往右数第一个比它大或小的数,这个应用场景则是数据结构栈的典型应用场景。我们在九章算法面试题42中的问题“构造MaxTree”也是用到了这种方法。因此,你需要记住在这种需求的情况下,使用栈可以使得时间复杂度和空间复杂度均为O(n)。直方图最大矩阵的问题,是面试中十分常见的问题,这个题目希望大家进行深入的学习,并编程实现。

你可能感兴趣的:(栈,矩阵,leetcode,lintcode,九章算法,九章算法面试题)