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

做网站源码流程国际财经新闻

做网站源码流程,国际财经新闻,自适应网站一般用什么框架做,郑州网站建设招商Tag 【单调栈】【暴力枚举】【数组】【2024-03-19】 题目来源 1793. 好子数组的最大分数 解题思路 本题和 84. 柱状图中最大的矩形 一样,计算的都是最大矩形的面积。只不过多了一个约束:矩形必须包含下标 k。 以下的方法一和方法二是 84. 柱状图中最…

Tag

【单调栈】【暴力枚举】【数组】【2024-03-19】


题目来源

1793. 好子数组的最大分数


解题思路

本题和 84. 柱状图中最大的矩形 一样,计算的都是最大矩形的面积。只不过多了一个约束:矩形必须包含下标 k

以下的方法一和方法二是 84. 柱状图中最大的矩形 的解法。我将在方法二中增加一个判断条件即可解答本题。

方法一:暴力枚举

思路

为了找出柱状图中最大的矩形,我们可以枚举矩形的宽和高。

如果我们枚举「宽」,我们需要用到两层循环来固定矩形的边界,并在矩形的边界中找出最小的高度。这样的操作总的时间复杂度为 O ( n 2 ) O(n^2) O(n2) n n n 为数组 heights 的高度,对于本题 1 0 5 10^5 105 的数据规模,一定超时。

如果我们枚举「高」,需要将数组 heights 中的每一个高度 heights[i] 作为矩形的高,并在这个高度左侧和右侧分别找到 最近的高度小于 heights[i] 的柱子,这两个柱子之间(不包括本身)的所有柱子高度均小于 heights,就是 i 能扩展的最远距离。 这样操作总的时间复杂度为 O ( n 2 ) O(n^2) O(n2),也会超时。

方法二:单调栈

思路

方法二就是将方法一种枚举「高」当中的找到 “最近的高度小于 heights[i] 的柱子” 利用单调栈的方法先计算出来,从来降低时间复杂度。

维护两个数组 leftrightleft[i]right[i] 分别表示柱子 i 左侧且最近的小于其高度的柱子和柱子 i 右侧且最近的小于其高度的柱子。这样以 heighet[i] 为高度的矩形宽度为

r i g h t [ i ] − 1 − ( l e f t [ i ] + 1 ) + 1 = r i g h t [ i ] − l e f t [ i ] − 1 right[i] - 1 - (left[i] + 1) + 1 = right[i] - left[i] - 1 right[i]1(left[i]+1)+1=right[i]left[i]1

首先定义一个单调栈 mono_stack 用来存放柱子在数组中的位置,接着从前往后枚举数组 heights 来更新 left 以及单调栈 mono_stack

  • 将栈顶的元素与当前枚举的元素值 heights[i] 比较,如果栈非空并且栈顶的元素值大于或者等于 heights[i],就出栈,直到栈为空或者找到比 heights[i] 小的栈中元素;
  • 如果栈为空了,说明 heights[i] 左侧没有比它小的元素,更新left[i] = -1;否则就是找到了heights[i] 左侧比它小的元素;
  • 将 nums2[i] 加入栈中。

按照以上操作可以计算出数组 left,同理可以得到 right

最后,依次枚举数组 heights 中的高度,计算以每个高度为矩形的高的最大值。因为题目要求 “好子数组中间必须包含下标 k”,即矩形必须包含下标 k,于是需要增加一条判断:left[i] < k && k < right[i],在该条件成立的情况下,计算矩形的最大面积,即本题的好子数组的最大可能分数。

实现代码

class Solution {
public:int maximumScore(vector<int>& heights, int k) {int n = heights.size();vector<int> left(n), right(n);stack<int> mono_stack;for (int i = 0; i < n; ++i) {while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {mono_stack.pop();}left[i] = mono_stack.empty() ? -1 : mono_stack.top();mono_stack.push(i);}mono_stack = stack<int>();for (int i = n-1; i >= 0; --i) {while(!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {mono_stack.pop();}right[i] = mono_stack.empty() ? n : mono_stack.top();mono_stack.push(i);}int res = 0;for (int i = 0; i < n; ++i) {if (left[i] < k && k < right[i])res = max(res, (right[i] - left[i] - 1) * heights[i]);}return res;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 heights 的高度。

空间复杂度: O ( n ) O(n) O(n)

写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

http://www.zhongyajixie.com/news/23759.html

相关文章:

  • 太原做网站个人百度关键词优化软件怎么样
  • 长沙做网站建设价格seo网站推广目的
  • 剪辑师培训班关键词优化公司网站
  • 免费推广网站建设seo排名技巧
  • 外贸自建零售网站做仿牌培训心得体会
  • 重庆做网站_重庆网站建设_重庆网络推广_重庆网络公司网络营销策略的概念
  • 网站建设就找桥三科技2023疫情最新情况
  • 厦门网站建设的公司爱站关键词挖掘软件
  • 邢台网红二妹外包seo公司
  • 做网站内容需要自己填的济南网站seo哪家公司好
  • 团员密码忘了seo是什么意思新手怎么做seo
  • 教育培训网站源码 模板 php培训机构网站源码培训学校网站源码电商自学网
  • 网站地链接结构中国联通和腾讯
  • 济南有哪些网站是做家具团购的石家庄最新消息今天
  • 厦门专业网站建设平台简述影响关键词优化的因素
  • 企业建设网站公司哪家好成都百度推广
  • 广州万户网络科技有限公司短视频seo询盘获客系统
  • 膜结构网站推广怎么做114外链
  • seo证书考试网站河南网站建设
  • 东莞 网站 建设今日头条新闻10条简短
  • 做网站的技术哪个简单网络工程师培训班要多少钱
  • 柳市做网站的公司营销方案怎么写
  • 做网站容易还是app南京百度推广开户
  • 东莞南城网站制作公司门户网站有哪些
  • 网站的差异百度seo优化怎么做
  • 如何做好网站优化百度搜索关键词设置
  • 南京银城建设 网站网页开发流程
  • 商城网站备案能通过吗保定网站建设报价
  • server 2012 iis 添加网站社交媒体推广
  • 北京h5网站建设平台新手怎么做网页