【hot100】刷题记录(48)-接雨水

题目描述:

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

 

示例 1:

 

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

 

提示:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

 

我的作答:

全靠解析续命,开摆开摆,我就这样.jpg

class Solution:
    def trap(self, height: List[int]) -> int:
        n = len(height)
        pre_max = [0]*n
        pre_max[0] = height[0]
        for i in range(1, n): #前缀最大
            pre_max[i] = max(pre_max[i-1], height[i])
        
        suf_max = [0]*n
        suf_max[-1] = height[-1]
        for i in range(n-2, -1, -1): #后缀最大
            suf_max[i] = max(suf_max[i+1], height[i])

        ans = 0
        for h, pre, suf in zip(height, pre_max, suf_max): #低的最大值减当前
            ans += min(pre, suf)-h
        return ans

 

参考:

谁小移动谁

class Solution:
    def trap(self, height: List[int]) -> int:
        ans = left = pre_max = suf_max = 0
        right = len(height) - 1
        while left < right:
            pre_max = max(pre_max, height[left])
            suf_max = max(suf_max, height[right])
            if pre_max < suf_max:
                ans += pre_max - height[left]
                left += 1
            else:
                ans += suf_max - height[right]
                right -= 1
        return ans

 

### LeetCode Hot100 题技巧与策略 LeetCodeHot100 是许多程序员提升算法能力的重要资源之一。以下是针对该部分题的一些技巧和策略: #### 1. **制定合理的题计划** - 推荐按照一定的顺序进行题,例如优先完成热题 HOT 100 和精选 TOP 面试题[^1]。这些题目覆盖了大部分常见的算法知识点和技术面试考点。 - 将题目按难度分类(简单、中等、困难),逐步攻克不同层次的挑战。 #### 2. **利用辅助工具提高效率** - 借助公子龙大佬开发的题网站及其插件功能[^2],可以更高效地查找解题思路并学习经典算法框架。 - 插件能够帮助用户快速定位到某类问题的核心解决方法,减少无谓的时间浪费。 #### 3. **注重总结归纳** - 对于每一道做过的题目,都应该尝试分析其背后的通用模式以及可能的变化形式[^4]。比如环形链表的相关变种问题(如回文链表)往往具有相似逻辑结构。 - 定期整理笔记,记下自己容易遗忘的知识点或者巧妙的解决方案。 #### 4. **模拟真实场景训练** - 如果目标是为了准备技术面试,则建议模仿实际考试环境来进行限时答题练习[^5]。这样不仅可以锻炼思维敏捷度还能增强抗压能力。 - 同时也要关注时间复杂度空间复杂度优化等方面的要求。 #### 5. **积极参与社区讨论** - 加入像寸铁这样的优质创作者所创建的学习小组或论坛,与其他志同道合者共同探讨难题解答方案。 - 学习他人优秀的思维方式有助于拓宽视野开阔眼界。 下面提供一段简单的 Python 实现代码作为例子展示如何处理其中一类常见数据结构——链表的操作: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def hasCycle(head: ListNode) -> bool: slow = fast = head while fast and fast.next: slow = slow.next # Move one step at a time. fast = fast.next.next # Move two steps at once. if slow == fast: # If there's an intersection point found. return True return False # No cycle detected after traversal completes. ``` 此函数用于检测单向链表是否存在闭环现象,采用双指针法实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值