Given a list of number, there is only one peak or one drop. Find the maximum
continuous drop.
Exps:
1 -> 2 -> 3 -> 9 -> 3 -> 0: 9 - 0 = 9;
10 -> 4 -> 3 -> 8: 10 - 3 = 7 ;
package array;
public class FindPeakOrDrop {
public int maxDrop(int[] arr) {
if (arr[0] > arr[1]) {
return findDrop(arr);
} else if (arr[0] < arr[1]) {
return findPeak(arr);
}
return 0;
}
int findDrop(int[] arr) {
int low = 0;
int high = arr.length - 1;
while (low + 2 <= high) {
int mid = low + (high - low) / 2;
if (arr[mid - 1] < arr[mid] && arr[mid] < arr[mid + 1]) {
high = mid - 1;
} else if (arr[mid - 1] > arr[mid] && arr[mid] > arr[mid + 1]) {
low = mid + 1;
} else {
return arr[0] - arr[mid];
}
}
int min = arr[low];
for (int i = low + 1; i <= high; i++) {
min = Math.min(min, arr[i]);
}
return arr[0] - min;
}
int findPeak(int[] arr) {
int low = 0;
int high = arr.length - 1;
while (low + 2 <= high) {
int mid = low + (high - low) / 2;
if (arr[mid - 1] < arr[mid] && arr[mid] < arr[mid + 1]) {
low = mid + 1;
} else if (arr[mid - 1] > arr[mid] && arr[mid] > arr[mid + 1]) {
high = mid - 1;
} else {
return arr[mid] - arr[arr.length - 1];
}
}
int max = arr[low];
for (int i = low + 1; i <= high; i++) {
max = Math.max(max, arr[i]);
}
return max - arr[arr.length - 1];
}
public static void main(String[] args) {
FindPeakOrDrop ss = new FindPeakOrDrop();
System.out.println(ss.maxDrop(new int[] { 1, 2, 3, 9, 3, 0 }));
System.out.println(ss.maxDrop(new int[] { 10, 4, 3, 8 }));
}
}