""" 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 """ import inspect ''' 出于加解法考虑,这题貌似动态规划比较好。 出于简单考虑,可以分列求,暴力解法,见Solution 但是出于栈专题考虑,还是在Solution1里面使用栈解。 ''' # ------------------------------------------------------------------------------------ # 分列求 # 第一列和最 题目 "leetcode42 接雨水" 是一个经典的计算机算法问题,目标是计算在给定的一组柱状图中,能够接住多少雨水。柱子的宽度为 1,高度不等,雨水会在柱子间积累。给定一个非负整数数组 `height`,代表每个柱子的高度,我们需要计算出在下雨后,柱子之间能接住的雨水总量。 ### 解决方案 #### 分列求(暴力解法) 这种方法是从每列开始分别计算能接住的雨水。对于每一列,我们需要找到左边的最大高度和右边的最大高度。如果当前柱子的高度小于左右两边的最大高度中的较小值,那么它就能接住 `(min(left_max, right_max) - height[i])` 单位的雨水。遍历整个数组,累加所有柱子能接住的雨水即可得到总雨水量。注意第一列和最后一列只需要考虑一个方向的最大高度。 ```python class Solution: def trap(self, height): if len(height) <= 1: return 0 left_max = height[0] right_max = max(height[i + 1:] for i in range(len(height) - 1)) ans = 0 for i in range(1, len(height) - 1): left_max = max(height[i - 1], left_max) right_max = max(height[i + 1], right_max) ans += min(left_max, right_max) - height[i] return ans ``` #### 栈法(高效解法) 栈法是一种更高效的空间优化解决方案。我们使用一个栈来保存柱子的索引,栈顶的元素总是当前已遍历到的柱子中最高的。遍历数组,当遇到比栈顶元素高的柱子时,说明栈顶的柱子被当前柱子和栈中更早的柱子界定,可以开始计算雨水。将栈顶元素弹出,并累加到答案 `ans`,直到栈为空。如果当前柱子的高度小于或等于栈顶元素,将当前柱子的索引入栈。这个过程持续到数组遍历完。 ```python class Stack: def __init__(self): self.stack = [] def push(self, x): self.stack.append(x) def pop(self): if self.stack: return self.stack.pop() else: return 0 def top(self): if self.stack: return self.stack[-1] else: return 0 def isEmpty(self): return len(self.stack) == 0 class Solution1: def trap(self, height): ans = 0 current = 0 st = Stack() while current < len(height): if height[current] <= st.top(): top = st.top() st.pop() while not st.isEmpty() and height[current] > height[st.top()]: top = st.top() st.pop() distance = current - st.top() - 1 bounded_height = min(height[current], height[st.top()]) - height[top] ans += distance * bounded_height st.push(current) current += 1 return ans ``` ### 总结 本题考察了两种不同的算法思路:暴力分列法和栈法。暴力分列法虽然直观,但时间复杂度较高,不适合大数据量的情况。栈法则通过优化空间复杂度,提高了效率,是解决此类问题的常见方法。理解这两种方法的原理和实现,有助于提高在实际编程问题中解决问题的能力。































- 粉丝: 7
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 适应互联网+教育的高职计算机专业课程体系改革研究.docx
- 综合布线六类系统方案-模版.doc
- 基于AVR单片机的智能小车方案设计书.doc
- 公路工程档案管理信息化路径探究.docx
- 全国计算机等级测验二级MS+Office高级应用真题题库2+2016年3月.docx
- 面向对象程序设计A总结.ppt
- 春计算机网络毕业论文.doc
- 《计算机应用基础》课程创新改革实践.docx
- 中小型企业的项目管理分析研究.docx
- 探讨计算机网络数据库的安全管理技术.docx
- 广播电视网应用云计算技术的实践与探索.docx
- 基于网络的城乡信息技术Scratch互动学习.docx
- 探究互联网+背景下医院微信公众平台建设的方向.docx
- 计算机网络安全教程课后答案.doc
- 2005年10月电子商务安全导论全国自考试题.doc
- 基于树莓派的智能小车:自动避障、实时视频传输、目标检测及网球追踪系统


