(力扣记录)42.接雨水

本文介绍了如何使用Python实现一个名为`trap`的函数,计算给定高度数组中可以容纳水的最大体积。通过双指针法,分别计算左右两侧可以容纳的最大高度,然后找出每个位置能容纳的水的量。该算法的时间复杂度为O(N),空间复杂度也为O(N)。

数据结构:数组

时间复杂度:O(N)

空间复杂度:O(N)

代码实现:

class Solution:
    def trap(self, height: List[int]) -> int:
        m = len(height)
        to_left = m * [0]
        to_right = m * [0]
        can_hold = m * [0]
        max_height = 0
        
        for i in range(len(height)):
            to_left[i] = max_height
            max_height = max(max_height, height[i])

        max_height = 0

        for i in range(m-1, -1, -1):
            to_right[i] = max_height
            max_height = max(max_height, height[i])

        for i in range(len(height)):
            hold = min(to_left[i], to_right[i]) - height[i]
            if hold > 0:
                can_hold[i] = hold

        return sum(can_hold)

        
        

### 动态规划基础题目 Python 实现 #### 70. 爬楼梯 此题旨在计算到达楼顶的方法总数。对于每一个台阶,可以从前面两个中的任意一个跳过来。 状态定义为 `dp[i]` 表示到第 i 层有几种方法[^2]。 状态转移方程基于当前层可以由前一层或前两层跳跃而来: \[ dp[i] = dp[i-1] + dp[i-2] \] 初始条件设置为: - \( dp[0] = 1 \),即停留在地面也算一种方式; - \( dp[1] = 1 \),仅有一种途径达到第一级阶梯; 边界情况处理当输入 n 小于等于零时返回特定值。 迭代求解直到获得最终结果。 ```python def climbStairs(n: int) -> int: if n <= 0: return 0 elif n == 1 or n == 2: return n prev, curr = 1, 2 for _ in range(3, n + 1): temp = curr curr += prev prev = temp return curr ``` 上述代码通过优化空间复杂度来减少内存占用,在每次循环中只保留最后两项的结果用于后续计算。 #### 雨水 雨水问题涉及寻找能够存储水的最大容量。这里采用动态规划的方式解决该问题。 为了简化理解过程,考虑使用辅助数组记录左侧最高柱子高度以及右侧最高柱子的高度。当前位置能存水量取决于两侧最大值较小者减去当前位置高度后的差值。 ```python def trap(heights: List[int]) -> int: if not heights: return 0 size = len(heights) left_maxes = [0]*size right_maxes = [0]*size water_trapped = 0 max_height_left = 0 for i in range(size): max_height_left = max(max_height_left, heights[i]) left_maxes[i] = max_height_left max_height_right = 0 for i in reversed(range(size)): max_height_right = max(max_height_right, heights[i]) right_maxes[i] = max_height_right min_height_sides = min(left_maxes[i], right_maxes[i]) if min_height_sides > heights[i]: water_trapped += (min_height_sides - heights[i]) return water_trapped ``` 这段程序首先构建了左右两边最高的墙的信息表,之后遍历每一列判断其上方能否积水并累加总和[^4]。 #### 旋转数组 针对给定的整数数组 nums 和非负整数 k ,将数组向右移动 k 步。这个问题可以通过三次反转操作完成:整体反转->部分反转->剩余部分再反转。 ```python from typing import List class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ length = len(nums) shift = k % length def reverse(start: int, end: int) -> None: while start < end: nums[start], nums[end] = nums[end], nums[start] start += 1 end -= 1 reverse(0, length - 1) reverse(0, shift - 1) reverse(shift, length - 1) ``` 这种方法利用了列表切片特性实现了高效的时间性能,并且不需要额外的空间开销[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值