题解 | #牛舍的占地面积#

牛舍的占地面积

https://www.nowcoder.com/practice/4d9d9bf23d874688aee6fc1ac5bf6902

知识点

单调栈

思路

假设n=areas.size()

分析题意我们知道,决定面积的是区间内最小的点,所以我们只需要考虑每一个点作为最小的点时,所处区间的面积。对于每一个点,需要维护左右两端比自己小的点,左边界为0,右边界为n.

我们可以使用单调栈来维护areas[i]的左右边界,思路类似于动态规划的单调栈优化单调上升子序列。我们首先用两次遍历,预处理每个端点的左右边界,然后再遍历每个端点,用自己的长度以及到左右两侧的距离之和相乘得到面积,维护最大的ans。

代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param areas int整型vector 
     * @return int整型
     */
    int maxArea(vector<int>& areas) {
        // write code here
        int n=areas.size();
        stack <int>st;
        vector<int>l(n),r(n);//左右边界

        for(int i=0;i<n;i++)//右边界
        {
            while(!st.empty()&&areas[st.top()]>=areas[i])st.pop();
            if(st.empty())l[i]=-1;//下界为0-1
            else l[i]=st.top();
            st.push(i);
        }
        
        for(int i=n-1;i>=0;i--)//左边界
        {
            while(!st.empty()&&areas[st.top()]>=areas[i])st.pop();
            if(st.empty())r[i]=n;//上界为n
            else r[i]=st.top();
            st.push(i);
        }
        
        int ans=-1;
        for(int i=0;i<n;i++)
        {
            ans=max(ans,areas[i]*(r[i]-l[i]-1));//更新面积
        }
        return ans;
    }
};
全部评论

相关推荐

lingo12:1.最好加个业务项目,大部分面试官工作以后会更偏重业务 2.实习部分描述一般般,可能hr看到会觉得你产出不够不给你过简历 3.蓝桥杯这些大部分人都有的,不如不写,反而减分项。
点赞 评论 收藏
分享
冰皮月饼_FLORRIEEE:你是准备投产品嘛?可以重新整理一下实习的bulletpoint,侧重描述你的工作所带来的结果收益,不要只写泛泛的内容(比如改写通过xx数据分析,提升xx),产品的价值并不在处理和分析数据的过程
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务