1.给定一个整型数组arr,已知其中所有的值都是非负,将这个数组看作一个柱子的高度图,计算按此排列的主子,下雨之后能接多少水。(数组以外的区域高度视为0)。如下图所示:
输入:[3,1,2,5,2,4]
输出:5
解题思路:对每一列求其 左边的最大值 和 右边的最大值 ,然后 该列值 减去两个最大值中的最小值就是该列可以保存的水量。
def maxWater(arr):
if(len(arr)==0): return 0
res = 0
lMax, rMax = [_ for _ in arr], [_ for _ in arr]
# 从1开始的原因是,第一列左边最大的值为其本身
for i in range(1, len(arr)):
lMax[i] = arr[i] if arr[i]>lMax[i-1] else lMax[i-1]
# 从倒数第二列开始的原因是,最后一列右边最大的值为其本身
for i in range(len(arr)-2, -1, -1):
rMax[i] = arr[i] if arr[i]>rMax[i+1] else rMax[i+1]
# 最后可以存水的数量就是左右列的最小值减去当前列的值总和
for i in range(len(arr)):
res += min(lMax[i], rMax[i]) - arr[i]
return res
2.给定一个非负整数数组nums,很定最开始处于一下标为0的位置,数组里面的每个元素代表下一跳能够的跳跃的最大长度,如果可以跳到数组最后一个位置,请你求出跳跃路径中所能获得的最多的积分。
1.如果能够跳到数组最后一个位置,才能计算所获得的积分,否则积分值为-1
2.如果无法跳跃(即数组长度为0时),也请返回-1.
3.数据保证返回的结果不会超过整形范围,即不会超过2^31 - 1
输入:[2,4,2,1,0,100]
输出:106
解题思路:这是一个倒序的解法,就是从最后一个数开始,如果前面的节点可以跳到最后一个,那就说明可以加进去,即可将该节点位置进行保存。值得说明的一点是,当前节点的值为可跳跃的最大值,也就是说当前节点跳跃的值是属于[0, num[i]]之间的。因此,也更加证明了从最后一个数往前推算的必要性。
def maxJumpGrade(nums) -> int:
if(len(nums) == 0): return -1
reachAble = [False for _ in nums]
# 最后一个值为真
reachAble[-1] = True
# 从倒数第二个值到第0个值进行遍历
for i in range(len(nums)-2, -1, -1):
# any函数是判断列表中至少有一个值为True,则返回True
# 列表中的范围就是为了判断从 位置i 到 位置i+max(0,nums[i])+1 处是否有True
# 最后+1的原因是python列表不包含右侧的值
# max(0, nums[i])的原因是为了获取 位置i 处的值,判断从该位置 加上该位置的值之间的位置是否有True
# 也就是是否有到达终点的路径
reachAble[i] = any(reachAble[i: i + max(0, nums[i]) + 1])
res = [n if i else 0 for i, n in zip(reachAble, nums)]
return sum(res) if reachAble[0] else -1