符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。
示例 1:
输入:arr = [0,1,0]
输出:1
示例 2:
输入:arr = [0,2,1,0]
输出:1
示例 3:
输入:arr = [0,10,5,2]
输出:1
示例 4:
输入:arr = [3,4,5,1]
输出:2
示例 5:
输入:arr = [24,69,100,99,79,78,67,36,26,19]
输出:2
package LeetCode;
/**
* 符合下列属性的数组 arr 称为 山脉数组 :
* arr.length >= 3
* 存在 i(0 < i < arr.length - 1)使得:
* arr[0] < arr[1] < ... arr[i-1] < arr[i]
* arr[i] > arr[i+1] > ... > arr[arr.length - 1]
* 给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。
*
* @author 犀角
* @date 2021/6/15 22:52
* @description
*/
public class MountainArray {
//枚举法
public static int peakIndexInMountainArray(int[] arr) {
int ans = -1;
//满足arr.length>=3
if (arr.length < 3) {
return ans;
}
//找到i+1处的元素大于i索引位置的元素即为所求元素,返回i
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
ans = i;
break;
}
}
return ans;
}
/**
* 思路:当i<i+1时,arr[i]<arr[i+1]成立;当i>i+1时,arr[i]>arr[i+1]恒成立
* @param arr
* @return
*/
public static int peakIndexInMountainArray2(int[] arr) {
int left = 1;
int right = arr.length - 2;
int ans = 0;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] > arr[mid + 1]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 7, 99, 3, 2};
int i = peakIndexInMountainArray(arr);
int l = peakIndexInMountainArray2(arr);
System.out.println("所求的位置为:" + l);
// System.out.println("所求的位置为:" + i);
}
}