# Python program for the above approach
# Function to check up at the index i
def isUp (i, arr, N):
return (i > 0 and i < N - 1
and arr[i] < arr[i - 1]
and arr[i] < arr[i + 1]);
# Function to check down at the index i
def isDown (i, arr, N):
return (i > 0 and i < N - 1
and arr[i] > arr[i - 1]
and arr[i] > arr[i + 1]);
# Solve function
def solve (arr, N):
# Initializing a boolean array
mark = [0] * N
total = 0;
# Iterate over the array
for i in range(1, N - 1):
# Peak
if (arr[i] > arr[i + 1] and arr[i] > arr[i - 1]):
mark[i] = 1;
total += 1
# Trough
elif (arr[i] < arr[i + 1]
and arr[i] < arr[i - 1]):
mark[i] = 1;
total += 1
# Initialize ans variable as total
ans = total;
for i in range(1, N - 1):
# Make arr[i] equal to arr[i - 1]
temp = arr[i];
arr[i] = arr[i - 1];
ans = min(
ans,
total - mark[i - 1] - mark[i]
- mark[i + 1]
+ isUp(i - 1, arr, N)
+ isDown(i - 1, arr, N)
+ isUp(i, arr, N)
+ isDown(i, arr, N)
+ isUp(i + 1, arr, N)
+ isDown(i + 1, arr, N));
# Make arr[i] equal to arr[i + 1]
arr[i] = arr[i + 1];
ans = min(
ans,
total
- mark[i - 1] - mark[i]
- mark[i + 1]
+ isUp(i - 1, arr, N)
+ isDown(i - 1, arr, N)
+ isUp(i, arr, N)
+ isDown(i, arr, N)
+ isUp(i + 1, arr, N)
+ isDown(i + 1, arr, N));
arr[i] = temp;
# Return the ans
return ans;
# Menu driver code
# Initializing an array
arr = [1, 4, 3, 5, 3, 8];
# Size of arr
N = len(arr)
# Calling solve function
print(solve(arr, N));
# This code is contributed by gfgking