Java version using this: https://codility.com/media/train/solution-flags.pdf And binary search. Got 100% and O(N).
public int solution(int[] A) {
int N = A.length;
boolean[] peaks = new boolean[N];
for (int i = 1; i < N - 1; i++) {
if (A[i - 1] < A[i] && A[i] > A[i + 1]) {
peaks[i] = true;
}
}
return binarySearch(A, 0, (int) Math.sqrt(N) + 2, peaks) - 1;
}
public static int binarySearch(int[] arr, int low, int high, boolean[] peaks) {
if (high >= low) {
int mid = low + (high - low) / 2;
if (!check(mid, arr, peaks)) {
return binarySearch(arr, low, mid - 1, peaks);
}
return binarySearch(arr, mid + 1, high, peaks);
}
return low;
}
public static boolean check(int x, int[] A, boolean[] peaks) {
int N = A.length;
int flags = x;
int pos = 0;
while (pos < N && flags > 0) {
if (peaks[pos]) {
flags -= 1;
pos += x;
} else {
pos += 1;
}
}
return flags == 0;
}