题目:​​原题链接​(困难)

标签:数组、贪心算法

解法

时间复杂度

空间复杂度

执行用时

Ans 1 (Python)

O ( N )

O ( N )

76ms (83.30%)

Ans 2 (Python)

Ans 3 (Python)

解法一:

class Solution:
def candy(self, ratings: List[int]) -> int:
size = len(ratings)

ans = 0

now_orient, num, lst = 0, 1, [] # 当前方向、当前方向数量、当前段各部分数量
for i in range(1, size):
# 计算下一个方向
if ratings[i] - ratings[i - 1] > 0:
next_orient = 1
elif ratings[i] - ratings[i - 1] < 0:
next_orient = -1
else:
next_orient = 0

# 处理两个相邻值相同的情况
if next_orient == 0:
lst.append(now_orient * num if now_orient != 0 else 1)

# 计算当前段的值
val = 0
for j in range(len(lst) - 1):
if lst[j] < 0 and lst[j + 1] > 0:
val -= 1
else:
val -= min(lst[j], -lst[j + 1])
for n in lst:
val += abs(n) * (abs(n) + 1) // 2

ans += val

now_orient, num, lst = 0, 1, []

# 处理当前方向为相等的情况
elif now_orient == 0:
num += 1
now_orient = next_orient

# 处理方向没有变化的情况
elif next_orient == now_orient:
num += 1

# 处理当期方向不同的情况
else:
lst.append(now_orient * num if now_orient != 0 else 1)

now_orient = next_orient
num = 2

else:
lst.append(now_orient * num if now_orient != 0 else 1)

# 计算当前段的值
val = 0
for j in range(len(lst) - 1):
if lst[j] < 0 and lst[j + 1] > 0:
val -= 1
else:
val -= min(lst[j], -lst[j + 1])
for n in lst:
val += abs(n) * (abs(n) + 1) // 2

ans += val

return ans