双指针 | 动态规划 | 单调栈:力扣42. 接雨水

1、题目描述:

双指针 | 动态规划 | 单调栈:力扣42. 接雨水_第1张图片

2、题解:

方法1:双指针法
思路:

定义双指针left,right,一个向右走,一个向左走,那么还需要定义左边的最大高度leftmax和右边的最大高度rightmax
循环:
    找出left左边的最大高度leftmax
    找出right右边的最大高度rightmax
    找到较小的值,更新res和指针
返回res
class Solution:
    def trap(self, height: List[int]) -> int:
        #双指针
        n = len(height)
        if n < 3:
            return 0
        left,right = 0,n - 1
        leftmax,rightmax = height[0],height[n-1]
        res = 0
        while left < right:
            leftmax = max(leftmax,height[left])
            rightmax = max(rightmax,height[right])
            if leftmax < rightmax  :
                res += leftmax - height[left]
                left += 1
            else:
                res += rightmax - height[right]
                right -= 1
        return res

方法2:动态规划
其实就是找两个数组,一个记录左边比i高的,一个记录右边比i高的
然后res += min(leftmax[i],rightmax[i])-height[i]

class Solution:
    def trap(self, height: List[int]) -> int:
        #动态规划,辅助数组
        if not height:
            return 0
        n = len(height)
        leftmax = [0] * n
        rightmax = [0] * n
        ans = 0
        #初始化
        leftmax[0] = height[0]
        rightmax[n-1] = height[n-1]
        for i in range(1,n):
            leftmax[i] = max(leftmax[i - 1],height[i])
        for j in range(n - 2, -1, -1):
            rightmax[j] = max(rightmax[j+1],height[j])
        for i in range(n):
            if min(leftmax[i],rightmax[i]) > height[i]:
                ans += min(leftmax[i],rightmax[i]) - height[i]
        return ans

3、复杂度分析:

方法1:
时间复杂度:O(N)
空间复杂度:O(1)
方法2:
时间复杂度:O(N)
空间复杂度:O(N)

你可能感兴趣的:(LeetCode高频面试题)