哈喽各位大佬好,我是菜鸟小明哥。扯个闲篇,姚期智大佬原本是学物理的,哈佛物理学博士,何凯明原本也是学过物理的,张朝阳也是学物理的(还是清华的物理),而本菜鸟也是学物理的,哈哈,说明我也有变成大佬的潜质。

接雨水1,力扣官方:实心柱体中间能存多少雨水?(柱体不一样高,因而能存水)
采用dp法来做,从左边来看柱体的最值,存储一个数组,从右边来看柱体的最值,存储一个数组,然后取两者的最小值,得到最终的结果

状态转移关系:

- class Solution:
- def trap(self, height: List[int]) -> int:
- ans=0
- if not height:
- return 0
- n = len(height)
- leftMax = [height[0]] + [0] * (n - 1)
- for i in range(1, n):
- leftMax[i] = max(leftMax[i - 1], height[i])
- rightMax = [0] * (n - 1) + [height[n - 1]]
- for i in range(n - 2, -1, -1):
- rightMax[i] = max(rightMax[i + 1], height[i])
- for i in range(n):
- ans += min(leftMax[i], rightMax[i]) - height[i]
- return ans
接雨水2,这个难度很大,将上面的换成了立体的,需要用到队列,忽略吧,谁要考这个直接说不会吧。故而,接雨水换成另一题:力扣官方:每个房屋至少有一个接雨水的桶,需要多少个桶?
题先读懂哈,如下举例:H代表房屋,符号.(英文句号)代表空位置
每个H至少有一个桶来接雨水(可以共用一个桶,例如"H.H",只需一个桶即满足题意),而且要有空位置放桶接雨水,没有空位置则无法满足,比如字符串"HH"(没有空位置),".HHH."(中间的房屋H无法放桶接雨水,因为它旁边也没有空位置) 这些情况返回-1,没有房屋H的情况就不需要桶来接雨水了,这种返回0,例如"......",".."
- class Solution:
- def minimumBuckets(self, street: str) -> int:
- n = len(street)
- i = ans = 0
- while i < n:
- if street[i] == "H":
- if i + 1 < n and street[i + 1] == ".":
- ans += 1
- # 直接跳过后续的两个位置
- i += 2
- elif i - 1 >= 0 and street[i - 1] == ".":
- ans += 1
- else:
- return -1
- i += 1
- return ans
直接做就是了,找房H,然后找两边的空位置,有就放桶。注释表示:如果是H.H或者H..就不需要考虑了直接跳过即可,就放一个桶就行。