python每日算法 | 接雨水(Day4)

Day4 难度:困难

题干:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
在这里插入图片描述
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

思路:

产生凹陷的地方才能存储雨水,那么高度一定是先减后增,所以思路就是维护一个高度递减的栈

步骤:

① 设置一个高度递减的栈
② 找出先增后减的转折点的位置
③ 求出那部分凹陷的面积
④ 遍历,继续求出其他的面积

代码:

class Solution:
    def trap(self, height: List[int]) -> int:
        length=len(height)
        if length < 3:
            return 0
        res = 0
        # 设置一个高度递减的栈
        stack=[]
        for index in range(0, length):  # 遍历index
            while len(stack)>0 and height[index] > height[stack[-1]]:   # 当栈>0并且index位置的值>栈里最后的一个元素的值
                top=stack.pop()     # 弹出栈中最后一个元素
                if len(stack) == 0:
                    break
                h = min(height[stack[-1]], height[index]) - height[top]  # 计算凹陷的高度
                dist = index - stack[-1] - 1    # 计算凹陷的宽度
                res += (dist * h)       # 求出存水的量
            stack.append(index)
        return res

大家可以根据思路,自己敲敲代码,有不明白的留言问我哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中常用的基本算法包括排序算法、搜索算法、递归算法、动态规划算法等。下面介绍一些常用算法的相关口和应用: 1. 排序算法 Python 中常用的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。其中,Python 内置的排序函数是 sorted(),该函数可以对列表、元组、字典等进行排序。例如: ```python lst = [3, 1, 4, 1, 5, 9, 2, 6, 5] sorted_lst = sorted(lst) print(sorted_lst) ``` 输出为:[1, 1, 2, 3, 4, 5, 5, 6, 9] 2. 搜索算法 Python 中常用的搜索算法包括线性搜索、二分搜索等。其中,Python 内置的搜索函数是 index() 和 count(),分别用于查找指定元素的位置和统计指定元素出现的次数。例如: ```python lst = [3, 1, 4, 1, 5, 9, 2, 6, 5] idx = lst.index(4) cnt = lst.count(1) print(idx) # 输出为:2 print(cnt) # 输出为:2 ``` 3. 递归算法 Python 中的递归算法常用于解决树形结构和分治问题。例如,计算斐波那契数列的第 n 项可以使用递归算法: ```python def fibonacci(n): if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(10)) # 输出为:55 ``` 4. 动态规划算法 Python 中的动态规划算法常用于解决最优化问题。例如,计算最长公共子序列的长度可以使用动态规划算法: ```python def lcs(s1, s2): m, n = len(s1), len(s2) dp = [[0] * (n+1) for _ in range(m+1)] for i in range(1, m+1): for j in range(1, n+1): if s1[i-1] == s2[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) return dp[m][n] s1 = "ABCD" s2 = "AEBD" print(lcs(s1, s2)) # 输出为:3 ``` 以上是 Python 常用的一些基本算法口和应用。需要注意的是,在实际应用中,不同算法的时间复杂度和空间复杂度可能会有很大的差别,需要根据具体情况选择合适的算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值