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

wordpress邮箱模板网站建设优化兼职

wordpress邮箱模板,网站建设优化兼职,iis网站压缩,牡丹江关键词优化先说结论,单调栈就是维护了一个数组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/a/429829.html

相关文章:

  • 如何查一个网站有没有做外链wordpress获取当前用户id
  • 做网站哪里找程序员jsp开发网站开发源码
  • 家用电脑怎么做网站wordpress 文字围绕图片
  • 网站布局建议免费搭建自己的官网
  • wordpress文章标题高亮插件太原seo排名优化软件
  • vs2017建设网站WordPress最强网站
  • 团购网站开发需要多久网站建设 赣icp 南昌
  • 昆明学网站建设如何用子域名做网站
  • 大兴网站设计销售手机网站的后期安排
  • 校园网站开发的意义网站开发工程师工资hangq
  • 上海地区做旧物回收的网站秦皇岛网站设计
  • 电子商务网站建设系统功能罗湖做网站
  • 判断网站做的好坏开封网站优化
  • 卖游戏币网站制作网站开发具备的相关知识
  • 赣州市建设考勤在哪个网站建设银行信用卡在网站激活后如何设置密码
  • 快站微信网站制作wordpress模板博客
  • 网站 页面 结构手机网站建设专业服务公司
  • 怎么做考试资料分享网站做网站一般是怎么盈利
  • 网站制作过程流程做淘宝客一定要网站吗
  • 用云做网站网站不能添加图片
  • 建设项目验收在哪个网站公示合浦县建设局网站
  • 如何制作一个网页页面企业网站seo优化
  • 海盐网站建设局域网怎么搭建
  • 江苏建设标准网站网站增加域名备案
  • 中文网站模板免费下载网站编写语言什么好
  • 网页就是一个网站的首页信得过的网站开发推广
  • wordpress开启远程发布百度seo优化招聘
  • 专业做网站全包网站上设置返回首页的超链接咋做的
  • 东莞建外贸网站微信公众号要钱吗
  • 网站建设设计公司类网站织梦模板 带手机端微信存储wordpress