代码随想录day49 || 42、接雨水 84、柱状图中最大的矩形

news/2024/9/29 13:29:26

42、接雨水

image

func trap(height []int) int {// 双指针思路,按照列计算雨水高度,分别计算每一列左右高于当前高度的最高柱子高度,然后通过min(left, right) - height[i] 得出当前列的雨水体积var res intvar left, right intfor i:=1; i<len(height)-1; i++ {left, right = height[i], height[i]for j:=i+1; j<len(height); j++ {if height[j] > right {right = height[j]}}for j:=i-1; j>=0; j-- {if height[j] > left {left = height[j]}}res += (min(left, right) - height[i]) * 1}return res
}
// 时间复杂度是n^2, 空间是1
// 上面解法对于左右最高高度计算涉及到重复,所以考虑空间换时间,用两个数组分别记录当前位置的左右最高高度
func trap(height []int) int {// 双指针思路,按照列计算雨水高度,分别计算每一列左右高于当前高度的最高柱子高度,然后通过min(left, right) - height[i] 得出当前列的雨水体积var res intvar left = make([]int, len(height))var right = make([]int, len(height))left[0] = height[0]for i:=1; i<len(height)-1; i++ {left[i] = max(height[i], left[i-1])}right[len(height) - 1] = height[len(height) - 1]for i:=len(height)-2; i>=0; i--{right[i] = max(height[i], right[i+1])}//fmt.Println(left, right)for i:=1; i<len(height)-1; i++ {res += (min(left[i], right[i]) - height[i]) * 1}return res
}

image

// 单调栈解法, 坑太多,注意单调栈保存的是索引!!!!!,别直接比较了,要取heithg[idx]
func trap(height []int) int {// 单调栈,var res intvar stack []intfor i:=0; i<len(height); i++{for len(stack) > 0 && height[i] >= height[stack[len(stack) - 1]] {top := stack[len(stack) - 1]stack = stack[ : len(stack) - 1]if len(stack) > 0 {left := stack[len(stack) - 1]right := ires += (min(height[left], height[right]) - height[top]) * (right - left - 1)}}stack = append(stack, i)}return res
}

84、柱状图中最大的矩形

image

func largestRectangleArea(heights []int) int {// 单调栈 找到左右第一个小于当前元素的位置,然后计算面积// 递减栈// 大于栈顶 入栈  小于等于 计算面积if len(heights) == 1{return heights[0]}var m int// 细节首尾+0 // 分别处理[2,3,4]  [4,3,2] 这两种单调的样例heights = append([]int{0}, heights...)heights = append(heights, 0)var stack []intstack = append(stack, 0)for i:=0; i<len(heights); i++ {for len(stack) > 0 && heights[i] <= heights[stack[len(stack) - 1]] {top := stack[len(stack) - 1]stack = stack[: len(stack) - 1]if len(stack) > 0 {var left, right, res intleft = stack[len(stack) - 1]right = ires = heights[top] * (right - left - 1)m = max(m, res)}}stack = append(stack, i)}return m
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/56063.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

大规模实施 OKR 的成功经验

在大型组织中,通常很难制定和使用适当的 OKR。当然,你可以很快制定出一个周期、一年甚至更长时间的 OKR,但要制定出便于执行和衡量进展的 OKR,那就是另一回事了。 以下是我在制定好的 OKR 方面遇到的困难。背景故事 前段时间,我们将 OKR 引入了一个相当大的组织。我们培训…

DNF85 仿官复古版单机安装教程 + 虚拟机一键端

前言 今天给大家带来一款单机游戏的架设:地下城与勇士 85 仿官复古版单机安装。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。 如…

[编程笔记] 从 bcp 客户端收到一个对 colid 7 无效的列长度

最近在做一个工具改造,实现A库数据导B库的功能。今天遇到一个奇怪问题,“从 bcp 客户端收到一个对 colid 7 无效的列长度”。最近在做一个工具改造,实现A库数据导B库的功能。今天遇到一个奇怪问题,“从 bcp 客户端收到一个对 colid 7 无效的列长度”。代码是从A库执行SELEC…

基于SIR模型的疫情发展趋势预测算法matlab仿真

1.程序功能描述 基于SIR模型的疫情发展趋势预测算法.对病例增长进行SIR模型拟合分析,并采用模型参数拟合结果对疫情防控力度进行比较。整体思路为采用SIR微分方程模型,对疫情发展进行过程进行拟合。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序Opt…

毕设开发日记第一阶段

第一阶段完成任务其实很简单,但是因为是第一次使用Unity,美术方面也可以说是零基础,我还是花费了好几天的时间在第一阶段的开发上面。 首先我确定是做一个2D的人物移动自由世界的游戏,所以我这边采用Unity作为游戏开发引擎,aseprite作为美术开发工具。 人物动画我刚开始尝…

Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

【日记】领导和领导之间差距还挺大(1223 字)

正文今天属实体验到了一波领导和领导之间的差距。7,8,9,10 号公休,今天省分行突然发通知,说信贷人员上岗资格考试 9.7 号下午考。我上午 10:30 从成都飞哈尔滨的机票。假条都批了。我跑去跟副行长汇报,副行长直接跟我说,那你能克服的还是克服一下,改签吧,考完再去公休。我…

2024Hvv漏洞汇总(128个POC)

2024年9月3日 Hvv情报搜集,漏洞合集全部都有POC(128个POC),可成功复现。2024Hvv漏洞整理(128个POC) ​(网上漏洞零零散散)下面是收集到的且有POC的漏洞整理合集,鄙人分了三种格式供各位提取,下面贴上目录与图片,由于字数有点大,各位请移步网盘自行提取。按照Hvv时间…