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

网络问卷制作平台/厦门seo厦门起梦

网络问卷制作平台,厦门seo厦门起梦,wordpress文章设置,网站后台管理系统进度单调栈算法 单调栈:单调栈中的元素满足单调递增 / 递减的条件。利用单调栈,可以找到第一个比它小/大的元素的位置。 新元素入栈前,会将栈顶破坏单调性的元素出栈,直到栈空或满足栈单调性才能加入新的元素。当元素出栈时&#xf…

单调栈算法

单调栈:单调栈中的元素满足单调递增 / 递减的条件。利用单调栈,可以找到第一个比它小/大的元素的位置

新元素入栈前,会将栈顶破坏单调性的元素出栈,直到栈空或满足栈单调性才能加入新的元素。当元素出栈时,说明待入栈的新元素是出栈元素向后找第一个比它小/大的元素。

通常,单调栈倾向于一维数组的问题,或者是多维数组可以转化为一维数组的问题。一般存储元素索引而非元素值。

时间复杂度:O(n),所有元素只入栈一次

代码框架:以单调递增栈为例

for i in range(n):while stack and stack[-1] > nums[i]:stack.pop()stack.append(i)

相关题目

【1】739. 每日温度

单调栈做法:典型的单调栈问题,没有任何弯弯绕绕。

class Solution:def dailyTemperatures(self, T: List[int]) -> List[int]:if not T: returnn = len(T)stack = []res = [0 for _ in range(n)]for i in range(n):while stack and T[i] > T[stack[-1]]:res[stack[-1]] = i - stack[-1]stack.pop()stack.append(i)return res

暴力做法肯定会超时:

class Solution:def dailyTemperatures(self, T: List[int]) -> List[int]:if not T: return []length = len(T)res = [0 for _ in range(length)]i, j = 0, 1for i in range(length - 1):while j < length and T[j] <= T[i]:j += 1if j == length:res[i] = 0else:res[i] = j - ii += 1j = i + 1return res

【2】42. 接雨水

单调栈做法:仔细观察可以发现,墙的高度只要满足单调递减,就一定接不到雨水;只有在出现递增的情况时,才有可能接到。所以实际上可以用一个单调递减栈来解决这个问题,只要后面的元素小于当前元素,就直接入栈,如果出现了大于的情况,表示可以结算雨水了,不断出栈计算可获得的雨水。

class Solution:def trap(self, height: List[int]) -> int:if not height: return 0n = len(height)stack, res = [], 0for i in range(n):while stack and height[i] > height[stack[-1]]:cur = stack.pop()if not stack: breakleft = stack[-1]right = ih = min(height[left], height[right]) - height[cur]res += (right - left - 1) * hstack.append(i)return res

【3】84. 柱状图中最大的矩形

单调栈做法:分析发现,在下一个柱子高度小于当前柱子高度时,就可以对前面的面积进行结算。也就是维护一个单调递增栈,每当入栈元素小于栈顶元素时,就循环出栈栈顶元素,直到满足单调性。

class Solution:def largestRectangleArea(self, heights: List[int]) -> int:if not heights: return 0heights = [0] + heights + [0]n = len(heights)stack, area = [], 0for i in range(n):while stack and heights[stack[-1]] > heights[i]:cur = stack.pop()height = heights[cur]width = i - stack[-1] -1area = max(area, height * width)stack.append(i)return area

【4】队列的最大值

单调栈做法:维护一个双端非严格单调递减队列,当待入队元素大于当前队尾元素时,将队尾元素出队,直到满足的单调递减性质为止,这样就能保证该辅助队列的队首元素总是当前最大值。在元素出队时,判断出队元素和辅助队列的队首元素是否相同,若相同则同时出队。

class MaxQueue:def __init__(self):self.queue = collections.deque()self.assist = collections.deque()   # 辅助队列def max_value(self) -> int:if not self.assist:return -1# 非严格递减双端队列return self.assist[0]def push_back(self, value: int) -> None:self.queue.append(value)# 非严格递减双端队列while self.assist and self.assist[-1] < value:self.assist.pop()self.assist.append(value) def pop_front(self) -> int:if not self.queue:return -1cur = self.queue.popleft()if cur == self.assist[0]:self.assist.popleft()return cur# Your MaxQueue object will be instantiated and called as such:
# obj = MaxQueue()
# param_1 = obj.max_value()
# obj.push_back(value)
# param_3 = obj.pop_front()
http://www.lbrq.cn/news/1270855.html

相关文章:

  • 民宅挂在民宿网站上 保洁谁做/seo优化排名工具
  • 手机网站需要多少钱/爱站网反链查询
  • 网站优化成本/开通网站需要多少钱
  • 有什么可以做兼职的网站/广告外链购买交易平台
  • 河南网站建设服务公司/网络推广策划
  • 超级seo助手/百度关键词优化排名
  • 我想做个旅游网站怎么做/如何营销推广
  • 东莞自适应网站建设/安卓优化大师最新版下载
  • 长沙感染人数最新消息/潜江seo
  • 全部网站/鸿星尔克网络营销案例分析
  • 邯郸网站建设咨询安联网络/推广软文范文
  • 北京网站建设 案例/seo网站排名优化快速排
  • 网站修改影响做百度竞价吗/宁波网络营销策划公司
  • 哈尔滨seo优化/优化流程
  • 南昌做网站建设哪家好/b2b免费发布信息平台
  • 手机程序编程/外贸seo是什么意思
  • 平面设计能干到老吗/武汉建站优化厂家
  • 一个旅游网站建设需求分析/苏州排名搜索优化
  • 网站建设案例步骤/关键词优化技巧有哪些
  • 手机免费创网站/企业网站建设的基本流程
  • 网站建设云梦/泰安seo推广
  • 绵阳专门做网站的公司有哪些/杭州关键词优化平台
  • 关于asp网站模板下载/有没有免费的写文案的软件
  • 安阳网站制作/网络营销最新案例
  • 外贸建站是什么意思/广州seo公司排行
  • wordpress建立视频网站/东莞网站建设方案外包
  • 郑州网站推广¥做下拉去118cr/3000行业关键词
  • 怎么让人搜索到自己做的网站/成都网站建设方案推广
  • 上海做产地证在哪个网站录入/网站建站开发
  • 用腾讯云做网站的好处/大连网站seo
  • 数据结构(12)二叉树
  • 数据结构初学习、单向链表
  • 解决 InputStream 只能读取一次问题
  • Cesium性能优化
  • 每日练习(红黑树)
  • 数据结构:多项式加法(Polynomial Addition)