代码随想录补打卡 42 接雨水 84 柱状图中最大的矩形

news/2024/10/25 5:52:13/

42 接雨水

代码如下

func trap(height []int) int {

       if len(height) <= 2 {        首先需要形成一个凹槽才能接到雨水,而凹槽需要至少三个元素,所以如果长度小于等于2就直接返回0 

           return 0 

       }

       res := 0 

       stack := make([]int,len(height))     定义一个单调递增栈,栈底元素为最大值 

       for i := 0 ; i < len(height) ; i++ {     遍历数组 

           for len(stack) > 0 && height[i] > height[stack[len(stack)-1]] {   如果当前遍历元素大于栈顶元素则说明可能形成了凹槽

                    mid := height[stack[len(stack)-1]]   此时栈顶元素就为凹槽的中间的那个元素,而当前遍历的元素是凹槽的右边元素,而栈顶下一个元素则为左边的元素 

                    stack = stack[:len(stack)-1]  弹出栈顶元素

                    if len(stack) != 0 {  此时需要判断当弹出栈顶元素后,栈里面是否还有元素,如果没有元素,则说明没有左边一个元素,依然无法形成凹槽,但是如果栈不为空,则说明可以形成凹槽

                           h := min(height[i],height[stack[len(stack)-1]])-mid   高即为当前遍历元素和栈顶元素,此时因为已经弹出了一个元素,所以此时的栈顶元素就为左边的元素 ,在减去中间元素的高度即为可接雨水的高度

                           w := i - stack[len(stack)-1] - 1  宽度是两者之间的距离 

                           res += h * w               对结果进行累加 

                    }

                   

           }

           stack = append(stack,i)  如果不大于那么就进行入栈操作 

       }

       return res 

}

func min(a,b int) int {

    if a < b {

        return a 

    }else {

        return b 

    }

}

84 柱状图中最大的矩形 

代码如下

func largestRectangleArea(heights []int) int {

                res := 0 

               heights = append([]int{0},heights...)    //在数组的头尾加0 

               heights = append(heights,0)

                stack := make([]int,len(heights))

                for i := 0 ; i < len(heights) ; i++ {

                    for len(stack) > 0 && heights[i] < heights[stack[len(stack)-1]] {  为递减的单调栈,所以如果栈顶元素大于当前元素需要进行计算 

                        mid := stack[len(stack)-1]    取出栈顶元素作为中间元素即为计算基准即高 ,此时当前遍历元素为他的右边元素,比他小。而他在栈里的下一个元素也比他小

                        stack = stack[:len(stack)-1]

                        left := stack[len(stack)-1]

                        tmp :=heights[mid]*(i-left-1)    右边下标减去左边下标在减1 即为距离

                        if tmp > res {  取一个最大值 

                            res = tmp 

                        }

                    }

                    stack = append(stack,i)

                }

                return res 

}


http://www.ppmy.cn/news/170901.html

相关文章

Rainbow Brackets的替代品

直接去插件市场搜 Rainbow Brackets Lite 彩虹括号精简版 从6.26版本后&#xff0c;从2022.3.1版本开始 原Rainbow Brackets插件开始收费&#xff0c;这个插件是原来插件的精简版&#xff0c;且免费。 觉得有用就点个赞吧&#xff0c;这样更多的人就能看到它了。&#x1f37a;&…

弘辽科技:派代网要跟大家说再见了

春节已过&#xff0c;派代网要跟大家说再见了。 作为卖家学习成长社区&#xff0c;派代网自2007年上线以来&#xff0c;伴随电商行业走过了15个年头。这些年来&#xff0c;我们陪伴一波又一波电商人成长&#xff0c;也近距离目睹了许多优秀电商公司的崛起。感谢这个好时代&…

Rainbow Brackets的配色修改和使用

修改配色&#xff1a;&#xff09; 敲好看内&#xff01;&#xff01; 记得每个都要改噢&#xff01; 5分别对应的是&#xff1a; 圆括号 方括号 波形括号 尖括号 6分别对应的是&#xff1a; ECB1E9 F6F0A9 78B8EF F3BBA2 A9D57E 使用方式 Ctrl 鼠标右键&#xff1a;高亮{}…

cgb2110-day05

文章目录 一,使用三种多表联查的方式完成以下练习:练习1:查询research部门的所有员工姓名和工资练习2:查询jack所在的部门信息练习3:查询总监的部门信息练习4:查询李军的平均分练习5:查询陈冰能讲的课程名 二,扩展视图--1,概述--2,测试 三,扩展SQL优化--1,测试--2,简单了解表设…

cgb2111-day02

文章目录 一,sqlyog工具的使用--1,新建连接--2,数据库--3,表--4,记录--5,练习,创建user表 二,字段约束--1,主键约束 三,基础函数--1,LOWER & UPPER--2,LENGTH & SUBSTR & CONCAT--3,REPLACE & IFNULL & ROUND-4,日期函数 & 转义符号 四,条件查询--1,DI…

rainbow的商店 贪心

描述 Rainbow开了一家商店&#xff0c;在一次进货中获得了N个商品。 已知每个商品的利润和过期时间。 Rainbow每天只能卖一个商品&#xff0c;并且过期商品不能再卖。 Rainbow也可以选择在每天出售哪个商品&#xff0c;并且一定可以卖出。 由于这些限制&#xff0c;Rainbow需要…

cgb2111-day06

文章目录 一,JDBC 练习--1,利用jdbc给user表中,添加一个用户的信息--2,模拟用户登录 二,SQL攻击--1,概述--2,改造用户登录--3,练习: 用新的传输器查询 三,优化: 提供jdbc的工具类--1,创建工具类--2,使用工具类(用新的传输器新增)--3,改造上面的练习(修改资源释放的代码) 四,作业…

cgb2111-day04

文章目录 一,多表联查--1,准备表和数据 二,笛卡尔积--1,概述--2,测试 三,连接查询--1,概述--2,测试 四,子查询--1,概述--2,测试 五,综合练习--1,测试 六,扩展:索引--1,概述--2,测试--3,总结 作业 一,多表联查 –1,准备表和数据 create table courses ( cno varchar(5) not nul…