这题确实比较绕,还是直接用O(N)的空间复杂度比较简单,O(1)比较难~
使用tmp来间接保存的作用时可以随时检查是否原本已经满足比小的大了~而不是在逆向的时候,盲目加。
class Solution:
def candy(self , arr ):
if not arr:
return 0
if len(arr) == 1:
return 1
tmp = [1] * len(arr)
for i in range(1, len(arr)):
if arr[i] > arr[i-1]:
tmp[i] += tmp[i-1]
for i in range(len(arr)-1, 0, -1):
if arr[i] < arr[i-1] and tmp[i-1] <= tmp[i]: ### 关键
tmp[i-1] = tmp[i] + 1
return sum(tmp)
确实挺难的~~
这个peak的作用就是可以保证取一个最大的,因为峰顶的高度其实取决于两侧,但又因为是从左边来的,所以见到右边之后需要做出一些处理~~
class Solution:
def candy(self , arr ):
if not arr:
return 0
if len(arr) == 1:
return 1
res = 1
peak = 1
up = 0
down = 0
for i in range(1, len(arr)):
res += 1# 每个都需要,后续计算的只是差值
if arr[i] > arr[i-1]:
up += 1
res += up
peak = up+1
down = 0
elif arr[i] == arr[i-1]:
up = 0
down = 0
peak = 1
else:
up = 0
res += down
down += 1
if down >= peak: #说明已经后续比你小了,那么peak必须比down高
res += 1 #这里代表peak+=1
return res