1、什么叫局部最小值
局部指的是左 中 右
最小值,自然是三个值做比较取最小了
边界场景:索引0和索引1,这个场景下,如果是判断索引0位置是否最小值的话,此时只需要2个数相比。同理,最后一个数组元素也是2值相比
2、这道算法题其实还有个前提,就是相邻数不等,也就是说,不会出现 1 2 2这样的数组
3、这边只要随机取一个局部最小值即可
上述的这些条件才满足了可以二分的情况
public static void main(String[] args) { for (int i = 0; i < 10; i++) { test(); } } private static void test() { int[] arrays = getRandomArray(); System.out.println(Arrays.toString(arrays)); int left = 0; int right = arrays.length - 1; while (left <= right) { int mid = (left + right)>> 1; // 数组左边越界的情况下,则不判断与左侧值的最小 // 数组右边越界的情况下,则不判断与右侧值的最小 if ((mid + 1 >= arrays.length || arrays[mid] < arrays[mid + 1]) && ( mid - 1 < 0 || arrays[mid] < arrays[mid - 1])) { System.out.println("局部最小值索引:" + mid); System.out.println((mid - 1 > -1 ? arrays[mid - 1] + ":" : ":") + arrays[mid] + ":" + (mid + 1 < arrays.length ? arrays[mid + 1] : "") ); return; } // 如果当前值不满足局部最小,则一定是大于某一侧的值,这边只判断左侧值是否小于当前值, // 如果是的话,则舍去右侧的区域。否则舍去左侧区域 if (mid - 1 >= 0 && arrays[mid] > arrays[mid - 1]) { right = mid - 1; } else { left = mid + 1; } } } private static int[] getRandomArray() { // 取一个相邻不等的数组 ThreadLocalRandom random = ThreadLocalRandom.current(); int[] ints = new int[20]; ints[0] = random.nextInt(100); for (int i = 1; i < ints.length; ) { int tmp = random.nextInt(100); // 只要不等于上一个数即可 if (tmp != ints[i - 1]) { ints[i++] = tmp; } } return ints; }