当青训营遇上码上掘金

1,164 阅读1分钟

当青训营遇上码上掘金

第五届青训营主题创作活动--主题4:攒青豆(python)

问题一:python获取键盘输入的列表

解决思路:

  1. python的input()默认返回的是字符串格式x,将x以,分隔开
  2. 利用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))

问题二:双指针法解决攒青豆问题

解决思路:

  1. 设置首尾指针i,j和指向左右最大值的指针left_max,right_max
  2. 首先比较左右指针值,由较小的一边走向较大的一边
  3. 循环条件:while(i<j)
  4. 移动过程中:遇到比当前最大值大的值时,更新最大值
  5. 移动过程中:遇到比当前最大值小的值时,将结果加入返回值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]

image.png

  • 第一轮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