局部最小值
前提:给一无序数组,相邻元素值不等;
求局部最小值。
题意解析:
1、局部最小值,非全局最小值。
2、可以借助二分法进行查找定位局部最小值。
场景考虑:
1)、一个元素比两边元素都小,即可认定位局部最小值。“执行比较逻辑”:
arr[mid]<arr[mid+1] && arr[mid]<arr[mid-1]
可知条件为:
Mid-1>=L , mid+1<=R , mid=(L+R)/2
根据数学方式推导满足的场景为: 走这个“执行比较逻辑”的条件为:L<=R-2 【L初始值0 ,R初始值 len-1 ,即数组至少2个元素】
2)、边界值情况:数组为空,数组元素个数:1/2个 可以提前单独处理。
3)、对边界值,二分法的LR位置一直在动,要考虑多元素数组处理后,LR可能更新成边界位置,情况同元素1/2个处理一致。
具体实现:
/*
* @Param arr :相邻元素不能相等,数组无序
* @Return 返回局部最小值下标
* */
int testDepartMinValue(int[] arr) {
if (null == arr || arr.length == 0) {
return -1;
}
int N = arr.length;
if (N == 1) {
return 0;
}
//采用二分法的形式
int L = 0;
int R = N - 1;
if (arr[L] < arr[L+1]) {
return L;
}
if (arr[R] < arr[R - 1]) {
return R;
}
while (L <= R - 2) {
int mid = (L + R) / 2;
if (arr[mid] < arr[mid - 1] && arr[mid] < arr[mid + 1]) {
return mid;
} else {
if (arr[mid] > arr[mid - 1]) {
R = mid - 1;
} else {
L = mid + 1;
}
}
}
//即便多个元素,不停被赋值的 L和 R 也有可能成为边界位置,这种情况要处理。
return arr[L] > arr[R] ? R : L;
}
#局部最小值#
查看1道真题和解析