当前位置: 首页 > wzjs >正文

郑州做网站kuihuakeji外链下载

郑州做网站kuihuakeji,外链下载,推广型的网站怎么做,电商平台投诉电话先说结论,单调栈就是维护了一个数组B,B[i-1]是B[i]的左边最近小/大位置。 且B[i]若被j pop出去,那么j就是B[i]的右边最近小/大的位置。以此得到所有位置左右最近小/最近大位置。 之前说过单调栈的使用场景和应该使用单调增还是减的栈&#xf…

先说结论,单调栈就是维护了一个数组B,B[i-1]是B[i]的左边最近小/大位置。 且B[i]若被j pop出去,那么j就是B[i]的右边最近小/大的位置。以此得到所有位置左右最近小/最近大位置。

之前说过单调栈的使用场景和应该使用单调增还是减的栈:单调栈应用技巧-CSDN博客

这次分析下为什么单调栈可以解决这类问题。

假如要求长度为n的数组A, 在任意位置的最近小的下标。可以遍历0到n-1,遍历的同时维护一个动态长度数组B。 如果当前遍历到i, 设此时B长度为m,那么对于任意j<m, 都有:B[j-1]是B[j]的左边最近小位置。而且B[m-1]等于i-1。

这样以来,处理i时:

若A[B[m-1]]<A[i]: 那么B[m-1]一定是i最近小的位置(相邻嘛),则直接把i插到B的最后即可。

反之,我们可以得到 i最近小的位置一定<=B[m-1]的最近小的位置(此处可以用反证法),而B[m-1]最近小的位置就是B[m-2], 所以 i最近小的位置一定<=B[m-2],现在再比较A[B[m-2]]和A[i],如果还是A[B[m-2]]>=A[i],就再找B[m-3]...,直到找到A[B[m-k]]<A[i],那么B[m-k]一定是i的最近小。这些操作就等于pop掉B[m-1]到B[m-k+1]。 最后直接把i插到B的最后即可。

以上操作就维护了数组B,保证里面相邻两个数存的都是最近小的编号,换个角度看其实就是单调栈。

leetcode 84为例:

84. 柱状图中最大的矩形 - 力扣(LeetCode)

这里算下标i的贡献时:找到i的左边最近小left_less[i]和右边最近小right_less[i]。直接那么i其实能向左延伸到left_less[i]+1, 向右延伸到right_less[i]-1,贡献值为:((right_less[i]-1)-(left_less[i]+1)+1) * A[i]

代码如下

class Solution {
public:int largestRectangleArea(vector<int>& A) {stack<int> B;int n = A.size();vector<int> left_less(n);for(int i=0; i<n; i++){left_less[i] = i;while(!B.empty()&&A[B.top()]>=A[i]){B.pop();}if(!B.empty()){left_less[i] = B.top();}else{left_less[i] = -1;}B.push(i);}while(!B.empty()){B.pop();}vector<int> right_less(n);for(int i=n-1; i>=0; i--){right_less[i] = i;while(!B.empty()&&A[B.top()]>=A[i]){B.pop();}if(!B.empty()){right_less[i] = B.top();}else{right_less[i] = n;}B.push(i);}int ret= 0;for(int i=0; i<n; i++){ret = max(ret, ((right_less[i]-1)-(left_less[i]+1)+1)*A[i]);}return ret;}
};

更进一步思考,其实从左向右遍历时,假设i被j pop出去的,那么j一定是i右边的最近小(很好证明),这样就不用单独逆序遍历求right_less[i]了,直接在i被pop时记录就行了。

上代码:

class Solution {
public:int largestRectangleArea(vector<int>& A) {A.push_back(-1);stack<int> B;int n = A.size();vector<int> left_less(n);vector<int> right_less(n);for(int i=0; i<n; i++){left_less[i] = i;right_less[i] = i;while(!B.empty()&&A[B.top()]>=A[i]){right_less[B.top()] = i;B.pop();}if(!B.empty()){left_less[i] = B.top();}else{left_less[i] = -1;}B.push(i);}int ret= 0;for(int i=0; i<n; i++){ret = max(ret, ((right_less[i]-1)-(left_less[i]+1)+1)*A[i]);}return ret;}
};

http://www.dtcms.com/wzjs/592425.html

相关文章:

  • 有那个网站做外贸初中生怎么升大专学历
  • 深圳市住房建设局网站百度为什么不收录网站的某个版块
  • 外省住房和城乡建设厅网站英文网站建设公司 杭州
  • 网站平台建设费用陕建上海公司官网
  • 网站建设开发全包外贸WordPress主机推荐
  • 房地产公司网站制作建设档案员证书查询网站
  • 学习php网站开发怎么样杨和网站建设
  • 建设项目竣工环保验收网站做旅游的网站在哪里做
  • 北京成交型网站建设价格做网站组织架构
  • 苏州企业网站制作开发网站开发 绩效考核
  • 公司推广网站怎么做网页视频怎么下载到手机相册
  • 广州网站商城建设网页制作的基本知识
  • 茂名专业网站制作公司中企动力销售赚得多吗
  • 绿色食品销售网站建设常州网站建设公司巧誉友网络
  • 西安商城网站建设制作湖北手机版建站系统信息
  • 网站设计名称网站上线盈利
  • 做网站是不是要拍法人的照片导航wordpress模板下载
  • 惠安县住房和城乡建设部网站做网站没装数据库
  • 建站模板免费网页设计与制作心得体会100字
  • 厦门外贸网站建龙岩网站报价
  • 沈阳网站建设找德泰诺互联网信息服务平台入口
  • 东莞市企业网站建设哪家好济南网站建设(力选聚搜网络)
  • 深圳营销网站建设多少钱怎么注册网上店铺
  • 赶集网网站建设在淘宝做印刷网站怎么办
  • 购物网站 缓存响应式网站和自适应网站
  • 网站开发的基本条件视频网站建站程序
  • 上海免费网站建设公司海南建设网网站
  • 做爰在线网站wordpress page 模板
  • 陈村网站设计建设银行网站不能打开
  • 湖北工程建设总承包有限公司网站标题优化方法