当青训营遇上码上掘金
第五届青训营主题创作活动--主题4:攒青豆(python)
问题一:python获取键盘输入的列表
解决思路:
- python的input()默认返回的是字符串格式x,将x以,分隔开
- 利用for循环将每个字符转换成int格式,并以列表形式返回
x = input()
x = x.strip('[')
x = x.strip(']')
list = x.split(',')
list = [int(list[i]) for i in range(len(list))]
print(trap(list))
问题二:双指针法解决攒青豆问题
解决思路:
- 设置首尾指针i,j和指向左右最大值的指针left_max,right_max
- 首先比较左右指针值,由较小的一边走向较大的一边
- 循环条件:while(i<j)
- 移动过程中:遇到比当前最大值大的值时,更新最大值
- 移动过程中:遇到比当前最大值小的值时,将结果加入返回值res
while i < j:
if list[i] > list[j]: # 右边低于左边
if list[right_max]<list[j]: # 右边当前高度小于右边最大高度
right_max = j # 否则更新右边最大高度
j -= 1
else:
res += list[right_max] - list[j] # 高度差为当前柱子上面的水量
j -= 1
else: # 左边低于右边
if list[left_max] < list[i]:
left_max = i
i += 1
else:
res += list[left_max]-list[i]
i += 1
案例解析
输入list = [5,0,2,1,4,0,1,0,3]
- 第一轮0<8:
5>3 右边更小,指针j开始移动 if 3!<3 右边最大高度仍为3 else res = 3-3 =0 指针j左移 - 第二轮0<7:
5>0 右边更小,指针j开始移动 if 3!<0 右边最大高度仍为3 else res = 3-0 =3 指针j左移 - 第二轮0<6:
5>1 右边更小,指针j开始移动 if 3!<1 右边最大高度仍为3 else res =3+3-1=5 指针j左移 - 第三轮0<5:
5>0 右边更小,指针j开始移动 if 3!<0 右边最大高度仍为3 else res =5+3-0=8 指针j左移 - 第四轮0<4:
5>4 右边更小,指针j开始移动 if 3<4 右边最大高度需要修改 righ_max = j = 4 else res =8 指针j左移 - 第五轮0<3:
5>1 右边更小,指针j开始移动 if 4<1 右边最大高度仍为4 else res =8+4-1=11 指针j左移 - 第六轮0<2:
5>2 右边更小,指针j开始移动 if 4<2 右边最大高度仍为4 else res =11+4-2=13 指针j左移 - 第七轮0<1:
5>0 右边更小,指针j开始移动 if 4<0 右边最大高度仍为4 else res =13+4-0=17 指针j左移 - 第八轮 循环结束 返回res = 17