局部最小值
前提:给一无序数组,相邻元素值不等;
求局部最小值。
题意解析:
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; }#局部最小值#