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

牛舍的占地面积

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;
    }
};
全部评论

相关推荐

醒工硬件:1学校那里把xxxxx学院去了,加了学院看着就不像本校 2简历实习和项目稍微精简一下。字太多,面试官看着累 3第一个实习格式和第二个实习不一样。建议换行 4项目描述太详细了,你快把原理图贴上来了。比如可以这样描述:使用yyyy芯片,使用xx拓扑,使用pwm控制频率与占空比,进行了了mos/电感/变压器选型,实现了xx功能 建议把技术栈和你做的较为有亮点的工作归纳出来 5熟悉正反激这个是真的吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务