某互联网大厂开始捡漏35岁以上人员

dd9283d976b06456f807ddae6b5c311f.gif

精品推荐:

《征服数据结构》《经典图论算法》

最近在脉脉上看到有人发帖称:某大厂开始捡漏35岁以上人员,原因是35岁以上的人有经验,有资源,可以让项目团队少走很多弯路。

而网友评论说是因为现在年轻人未必便宜,有些年轻人薪资倒挂,收入甚至更高。还有的说这是失业之后的幻觉。不过我到希望这是真的,这样就可以缓解一下大龄程序员焦虑的问题,把更过的精力放在工作上。

bf6127528515d2b1dba5b6e85d9a8546.png

网友评论:

221e208fd91868b105c741f84ce93b47.png

32ee7919643f36c8417eb2dcc21ca910.png

921c6e0a9e2672a51a8db35fc6c78d89.png

853f0a8a940b696536960fd78b0e7a63.png

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第84题:柱状图中最大的矩形。

问题描述

来源:LeetCode第84题

难度:困难

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例1:

3f6b3d745b93a4ea2a3cd85525db789e.jpeg

输入:heights = [2,1,5,6,2,3]

输出:10

解释:最大的矩形为图中红色区域,面积为 10

  • 1 <= heights.length <=10^5

  • 0 <= heights[i] <= 10^4

问题分析

这题让求的是柱状图能勾勒出来的最大矩形面积,因为勾勒出来的最大矩形面积高度肯定是其中某一个柱子的高度,我们可以使用单调栈解决,单调栈存储的是元素的下标,下标对应的值从栈底到栈顶是单调递增的。

遍历数组的时候,如果当前元素的值大于等于栈顶元素所对应的值,就把当前元素的下标添加到栈中。如下图,当遍历到前4个元素的时候,因为都是后面一个比前面一个大,所以都压栈,压入的是元素下标,不是元素的值。

7f3567c76f038fd84b7ebe7e301aac80.png

如果当前元素的值小于栈顶元素,说明栈顶元素遇到了右边比他小的,那么这个栈顶元素左边比他小的是哪个呢?就是他在栈中的下一个元素(也有可能相等,但不影响后面的计算),也就是栈顶元素出栈之后新的栈顶元素。

当我们知道一个柱子左边和右边比他小的,就可以计算以当前柱子为矩形高度所能勾勒出来的最大矩形了。比如上面的图中当指针指向 2 的时候,我们来看下计算步骤。

41fe875530d92258b8300de12f9cacdd.png

7ecea9a9f650a200a226eb1b505c4a8f.png

7847bea733a7f36080c19d3c0c4be4c8.png

这里要注意一点的是数组中的第一个元素前面是没有值的,最后一个元素后面也是没有值的,所以我们可以把数组的前面和后面分别添加一个 0 。

JAVA:

public int largestRectangleArea(int[] heights) {
    Stack<Integer> stack = new Stack<>();// 栈顶到栈底是递减的
    // 第一个柱子的下标是0,默认他前面一个是-1。
    stack.push(-1);
    int maxArea = 0;// 记录最大面积
    for (int i = 0; i <= heights.length; i++) {
        // 当前柱子的高度,如果i == heights.length,表示没有柱子,高度为0。
        int curHeight = i == heights.length ? 0 : heights[i];
        // 如果当前柱子的高度小于栈顶元素所对应柱子的高度,栈顶元素出栈,计算面积。
        while (stack.size() > 1 && curHeight < heights[stack.peek()]) {
            int h = heights[stack.pop()];// 出栈的柱子高度
            int area = (i - 1 - stack.peek()) * h;// 计算面积
            maxArea = Math.max(maxArea, area);// 保存最大面积
        }
        stack.push(i);// 当前柱子的下标入栈
    }
    return maxArea;// 返回最大面积。
}

C++:

public:
    int largestRectangleArea(vector<int> &heights) {
        stack<int> stk;// 栈顶到栈底是递减的
        // 第一个柱子的下标是0,默认他前面一个是-1。
        stk.push(-1);
        int maxArea = 0;// 记录最大面积
        for (int i = 0; i <= heights.size(); i++) {
            // 当前柱子的高度,如果i == heights.length,表示没有柱子,高度为0。
            int curHeight = i == heights.size() ? 0 : heights[i];
            // 如果当前柱子的高度小于栈顶元素所对应柱子的高度,栈顶元素出栈,计算面积。
            while (stk.size() > 1 && curHeight < heights[stk.top()]) {
                int h = heights[stk.top()];// 出栈的柱子高度
                stk.pop();
                int area = (i - 1 - stk.top()) * h;// 计算面积
                maxArea = max(maxArea, area);// 保存最大面积
            }
            stk.push(i);// 当前柱子的下标入栈
        }
        return maxArea;// 返回最大面积。
    }

Python:

def largestRectangleArea(self, heights: List[int]) -> int:
        # 第一个柱子的下标是0,默认他前面一个是 - 1。
        stk = [-1]  # 栈顶到栈底是递减的
        maxArea = 0  # 记录最大面积
        for i in range(0, len(heights) + 1):
            # 当前柱子的高度,如果i == heights.length,表示没有柱子,高度为0。
            curHeight = 0 if i == len(heights) else heights[i]
            # 如果当前柱子的高度小于栈顶元素所对应柱子的高度,栈顶元素出栈,计算面积。
            while len(stk) > 1 and curHeight < heights[stk[-1]]:
                h = heights[stk.pop()]  # 出栈的柱子高度
                area = (i - 1 - stk[-1]) * h  # 计算面积
                maxArea = max(maxArea, area)  # 保存最大面积
            stk.append(i)  # 当前柱子的下标入栈
        return maxArea  # 返回最大面积。

bd4960255e2f3b492bd0adc2fc7e832e.gif

笔者简介

博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值