代码随想录算法训练营第五十九天| LeetCode503. 下一个更大元素 II、LeetCode42. 接雨水

news2025/1/14 12:48:04

一、LeetCode503. 下一个更大元素 II

        1:题目描述(503. 下一个更大元素 II)

        给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

        数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

        2:解题思路

class Solution:
    def nextGreaterElements(self, nums: List[int]) -> List[int]:
        # # 用两个nums数组,拼成一个nums_pin,然后再使用单调栈
        # result = [-1] * (2*len(nums))
        # res_stack = [0]
        # nums_pin = nums[:]
        # for item in nums:
        #     nums_pin.append(item)
        # for i in range(1, len(nums_pin)):
        #     if nums_pin[i] <= nums_pin[res_stack[-1]]:
        #         res_stack.append(i)
        #     else:
        #         while len(res_stack)!=0 and nums_pin[i] > nums_pin[res_stack[-1]]:
        #             index = res_stack.pop()
        #             result[index] = nums_pin[i]
        #         res_stack.append(i)
        # return result[:len(nums)]

        # 循环遍历nums
        result = [-1]*len(nums)
        res_stack =[0]
        for i in range(1, 2*len(nums)):    # 遍历长度为两个nums
            # 当前遍历的值i,除以nums的长度取余,就可以得到当前i对应在nums中的下标
            if nums[i%len(nums)] <= nums[res_stack[-1]]:
                res_stack.append(i%len(nums))
            else:
                while len(res_stack)!=0 and nums[i%len(nums)] > nums[res_stack[-1]]:
                    index = res_stack.pop()
                    result[index] = nums[i%len(nums)]
                res_stack.append(i%len(nums))
        return result

二、LeetCode42. 接雨水

        1:题目描述(42. 接雨水)

        给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

        2:解题思路

        解法一:双指针

class Solution:
    def trap(self, height: List[int]) -> int:
        # 按照列来计算雨水的高度,雨水的宽度均为1,求出每列雨水的体积,然后求和
        # 双指针
        # 遍历数组height,求每列柱子的左侧最高高度left_height,右侧最高高度right_height,
        # 取两侧高度最小值 减去 柱子本身的高度,就是水滴的高度,min(left_height, right_height)-height[i]
        height_sum = 0
        for i in range(len(height)):
            # 第一个柱子和最后一个柱子不接水
            if i == 0 or i == len(height)-1:
                continue
            # 记录右边柱子的最高高度
            right_height = height[i]
            # 记录左边柱子的最高高度
            left_height = height[i]
            # 从当前遍历的下一个位置,开始遍历剩下的height,求当前遍历位置右边的最高高度
            for r in range(i+1, len(height)):
                if height[r] > right_height:
                    right_height = height[r]
            # 从当前遍历的上一个位置,开始遍历前面的height,求当前遍历位置左边的最高高度
            for l in range(i-1, -1, -1):
                if height[l] > left_height:
                    left_height = height[l]
            # 求当前位置能接水的高度,左右高度的最小高度 减去 当前位置本身的高度,
            h = min(left_height, right_height) - height[i]
            if h > 0:
                height_sum += h
        return height_sum

        解法二:动态规划

class Solution:
    def trap(self, height: List[int]) -> int:
        # 动态规划
        if len(height) <= 2:
            return 0
        res = 0
        maxleft = [0]*len(height)       
        maxright = [0]*len(height)
        # 记录每个柱子左边柱子的最大高度
        maxleft[0] = height[0]
        for l in range(1, len(height)):
            # 在前一个柱子左边的最大高度,和当前柱子的高度中取最大值
            maxleft[l] = max(maxleft[l-1], height[l])
        # 记录每个柱子右边柱子的最大高度,从后往前遍历
        maxright[len(height)-1] = height[len(height)-1]
        for r in range(len(height)-2, -1, -1):
            # 在后一个柱子右边的最大高度,和当前柱子的高度中取最大值
            maxright[r] = max(maxright[r+1], height[r])
        # 求和
        for i in range(len(height)):
            h = min(maxleft[i], maxright[i]) - height[i]
            if h > 0:
                res += h
        return res

        解法三:单调栈

class Solution:
    def trap(self, height: List[int]) -> int:
        # 单调栈
        # 按照行的方向来计算雨水
        # 从栈顶到栈底的顺序,从小到大
        # 通过三个元素来接水:栈顶、栈顶的下一个元素,以及即将入栈的元素
        # 雨水的高度是:min(凹槽左边高度, 凹槽右边高度) - 凹槽底部高度
        # 即:min(栈顶下一个元素,即将入栈的元素) - 栈顶的元素
        # 雨水的宽度是:凹槽右边的下标-凹槽左边的下标-1(只求中间宽度)
        res = 0
        res_stack = [0]
        for i in range(1, len(height)):
            # 情况一:即将入栈的元素小于栈顶元素,直接入栈
            if height[i] < height[res_stack[-1]]:
                res_stack.append(i)
            # 情况二:即将入栈的元素小于栈顶元素,将栈顶元素弹出,入栈即将入栈的元素
            # 因为,当前柱子高度和栈顶一致时,左边的一个是不可能存在雨水的,所以保留右侧新柱子
            # 需要使用最右边的柱子来计算
            elif height[i] == height[res_stack[-1]]:
                res_stack.pop()
                res_stack.append(i)
            # 情况三:即将入栈的元素大于栈顶元素,出现凹槽了
            else:
                # 抛出所有较低的柱子
                while res_stack and height[i] > height[res_stack[-1]]:
                    # 栈顶就是中间的柱子,就是凹槽底部的高度
                    mid_height = height[res_stack[-1]]
                    # 弹出栈顶元素
                    res_stack.pop()
                    if res_stack:
                        right_height = height[i]
                        left_height = height[res_stack[-1]]
                        # 两侧的最小高度 - 凹槽底部的高度
                        h = min(right_height, left_height) - mid_height
                        # 两侧柱子的中间宽度:右侧柱子的下标 - 左侧柱子的下标 - 1
                        w = i - res_stack[-1] -1
                        # 求体积
                        res += h*w
                # 栈为空,将当前元素入栈
                res_stack.append(i)
        return res

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

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

相关文章

实践 DevOps 测试策略

什么是 DevOps 测试策略&#xff1f; DevOps 的一个重要组成部分是持续集成/持续交付(CI/CD)&#xff0c;在 CI 和 CD 之间的就是持续测试。 如果不进行持续测试&#xff0c;将会出现&#xff1a; 缺陷的泄漏软件延期交付客户不满意DevOps 测试策略的好处 可以提供更快的反…

如何在vscode、remix中结合hardhat编译部署合约

创建 hardhat 工程 # 创建npm空项目&#xff0c;注意这里要选择合约项目对应的文件目录 npm init # 安装 hardhat 环境&#xff0c;这里安装的版本 2.11.1 npm install --save-dev hardhat2.11.1 # 创建工程 npx hardhat首先创建 npm 空项目&#xff0c;注意这里要选择合约项目…

Linux编程环境

一、实验目的 1&#xff0e;熟悉Linux下C语言程序设计的基本步骤 2&#xff0e;掌握gcc编译器的各种参数的使用方法 3&#xff0e;掌握gcc编译器创建函数库的方法 4&#xff0e;掌握gdb调试程序的方法 5&#xff0e;掌握多文件编译中的makefile的用法 二、实验软硬件要求…

matlab学习笔记(八)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 matlab学习笔记&#xff08;八&#xff09;一、傅里叶变换的MATLAB求解二、连续时间信号的频谱图三、MATLAB分析LTI系统的频率特性一、傅里叶变换的MATLAB求解 MATLAB的symb…

大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS

文章目录&#x1f4da;web前端期末大作业 (1500套) 集合一、网页介绍二、网页集合三、作品演示A电影主题B漫画主题C商城主题D家乡主题E旅游主题F餐饮/美食主题G环境主题H游戏主题I 个人主题K体育主题L博客主题M汽车主题N文化主题P美妆主题Q企业主题R教育主题S其他主题&#x1f…

Docker的私有仓库部署——Harbor

一.Docker原生私有仓库—— Registry 1.1 Registry的简单了解 关于Docker的仓库分为私有库和公有仓库&#xff0c;共有仓库只要在官方注册用户&#xff0c;登录即可使用。但对于仓库的使用&#xff0c;企业还是会有自己的专属镜像&#xff0c;所以私有库的搭建也是很有必要的…

力扣(LeetCode)1780. 判断一个数字是否可以表示成三的幂的和(C++)

进制转换 转换 333 进制&#xff0c;如果每一位非 000 即 111 &#xff0c;returntruereturn\ truereturn true (数字 000 除外&#xff09;。 如果任意一位为 222 &#xff0c;returnfalsereturn\ falsereturn false 。 证明: 对于第 ppp 位&#xff0c; 如果 p0p0p0 &#…

数据结构——树和二叉树最全总结(期末复习必备)

目录 树和二叉树 树的基本术语&#xff08;均以上图b为例&#xff09;&#xff1a; 遍历二叉树&#xff1a; 线索二叉树&#xff1a; 树的存储结构&#xff1a; 树与二叉树的转换&#xff08;利用的就是把二叉树和树表示成相同的二叉链表&#xff09;&#xff1a; 森林与二…

KubeSphere 接入外部 Elasticsearch 最佳实践

作者&#xff1a;张坚&#xff0c;科大讯飞开发工程师&#xff0c;云原生爱好者。 大家好&#xff0c;我是张坚。今天来聊聊如何在 KubeSphere 中集成外置的 ES 组件。 KubeSphere 在安装完成时候可以启用日志组件&#xff0c;这样会安装 ES 组件并可以收集所有部署组件的日志…

索引优化学习

背景 最近做查询优化&#xff0c;学到的。字段长度&#xff0c;索引长度联合索引计算是否使用范围查询使用索引 字段长度&#xff08;varchar&#xff09; 只谈论varchar&#xff1a;首先我们建表varchar(20) 中的20是字符数。看你的数据库编码 执行&#xff1a;show creat…

支持多种网关类型!米尔基于Zynq-7010/20开发平台工业网关设计应用

随着工业物联网的飞速的发展&#xff0c;5G时代的到来&#xff0c;工业控制系统在生产领域应用越来越广泛&#xff0c;工业物联网为未来工业控制系统灵活性和可扩展性的需求提供了支持。工业物联网使我们的生产数据可以进行规模化集中存储&#xff0c;并利用高速采集、云计算等…

ChatGPT国产平替出现了:APP商店就能下载,还可给AI加人设,背后公司刚成立3个月...

明敏 发自 凹非寺量子位 | 公众号 QbitAIChatGPT太火爆谁不想上手试试&#xff1f;但注册复杂、服务器拥挤……着实有点麻烦。不过很快就有极客网友指路&#xff0c;说国内其实已经有类似的APP上线了&#xff0c;也是上知天文下知地理的那种。比如聊聊《三体》&#xff0c;还会…

Transformer 训练优化

前言 自 BERT 出现以来&#xff0c;NLP 领域已经进入了大模型的时代&#xff0c;大模型虽然效果好&#xff0c;但是毕竟不是人人都有着丰富的 GPU 资源&#xff0c;在训练时往往就捉襟见肘&#xff0c;出现显存 out of memory 的问题&#xff0c;或者训练时间非常非常的久&…

web期末大作业:基于html+css+js制作深圳大学网站(13页) 学校班级网页制作模板 学生静态HTML网页源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【easypoi 模板导出嵌套 list 问题】

easypoi 模板导出多 list 问题1背景1.1 espoi 模板定义1.2 导出结果1.3发现共享单车的数据没有显示&#xff0c;手动操作取消共享单车的单元格合并1.4手动取消单元格合并后数据&#xff0c;正常再把框线画好1.5 代码操作&#xff1a;用 esaypoi 处理到1.2&#xff0c;用基础 po…

聊聊与前端工程师天然互补的 Serverless

作为前端工程师&#xff0c;我们的使命是为用户提供良好的前端用户体验。随着云原生时代的到来&#xff0c;显而易见的&#xff0c;我们能做的更多了。Serverless 产品的特点是免运维、按量付费和自适应弹性&#xff0c;所以我们可以利用云上的各种 Serverless 能力&#xff0c…

《程序员的自我修养》程序实现的两大环境

学习内容 翻译环境 预处理 编译 汇编 链接 执行环境 在标准C的任何一种实现中&#xff0c;都存在两个不同的环境&#xff1a; 1.翻译环境&#xff1a;在这个环境中&#xff0c;源代码被翻译成为可执行的机器指令。 2.执行环境&#xff1a;用于执行实际的代码 在VS2022中&…

字符串的读入方式

文章目录1、scanf2、fgets()3、cin4、cin.getline()5、getline()1、scanf scanf只能读入不带空格的字符串&#xff0c;遇到空格则结束。scanf只能读入字符数组&#xff0c;不能读入string。scanf在读入的时候&#xff0c;会自动在字符串的末尾加上’\0’。定义字符数组长度时&…

虚表指针在C++类的继承/多态与重载中的基本逻辑

文章目录前言重载继承虚函数虚函数表动态绑定的实现析构函数构造函数多态子类直接继承父类的方法&#xff0c;不覆盖多重继承纯虚函数前言 C在C语言的基础上增加了类的概念&#xff0c;而类的最关键的特性就是三个&#xff1a; 继承多态重载 这篇文章想接着上两篇C相关的文章…

[附源码]Python计算机毕业设计SSM基于推荐算法的汽车租赁系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…