Работает путем нахождения индекса максимума и минимума.
Для увеличения с последующим уменьшением проверяет, что значения до индекса максимума увеличиваются, а затем уменьшаются.
Для уменьшения с последующим увеличение проверяет, что значения до индекса min уменьшается, а затем увеличивается.
Способен обрабатывать плато.
Код
def hillvalley(A):
# Check increasing followed by decreasing
index, _ = max(enumerate(A), key=lambda v: v[1])
if all(A[i]<=A[i+1] for i in range(index)) and \
all(A[i]>=A[i+1] for i in range(index, len(A)-1)):
return True
# Check decreasing followed by increasing
index, _ = min(enumerate(A), key=lambda v: v[1])
if all(A[i]>=A[i+1] for i in range(index)) and \
all(A[i]<=A[i+1] for i in range(index, len(A)-1)):
return True
return False
Тест
for t in [[1,2,3,5,4,3,2,1], [4,3,2,1,1,2,3,5], [1,2,1,5,4,3,2,1]]:
print(f'{t} -> {hillvalley(t)}')
Выход
[1, 2, 3, 5, 4, 3, 2, 1] -> True
[4, 3, 2, 1, 1, 2, 3, 5] -> True
[1, 2, 1, 5, 4, 3, 2, 1] -> False