二分搜索

作者: 一凡呀 | 来源:发表于2017-12-04 15:39 被阅读0次

    应用:

    找一个数组中的局部最小值,任意一个都行。(这个就不要求二分必须有序)
    局部最小值:如果arr[0]<arr[1] 那0位置就是局部最小值,如果arr[arr.length-1]<arr[length-2]那么arr.length-1就是局部最小值,如果arr[m]<arr[m+1]且小于arr[m-1]那么m就是局部最小值

    思路:

    如果局部最小值不在最左边和最右边,那么说明肯定在中间,如下图所示


    image.png

    如图所示,m极为局部最小值,当m比m+1和m-1都大的时候,找那边都行
    这里注意一下整体看,最开始是下降趋势arr[0]<arr[1] ,最后是上升趋势arr[arr.length-1]<arr[length-2],所以局部最小在中间,既然在最后有上升趋势即arr[arr.length-1]<arr[length-2],所以中间肯定就有个开始上升趋势的地方,和之前下降趋势一结合就肯定有局部最小,类似一个先下降后上升的一元二次函数,在最低点就是局部最小呗。

    代码:

    public static int getLessIndex(int[] arr) {
            if (arr == null || arr.length == 0) {
                return -1; // no exist
            }
            if (arr.length == 1 || arr[0] < arr[1]) {
                return 0;
            }
            if (arr[arr.length - 1] < arr[arr.length - 2]) {
                return arr.length - 1;
            }
            int left = 1;
            int right = arr.length - 2;
            int mid = 0;
            while (left < right) {
                mid = (left + right) / 2;
                if (arr[mid] > arr[mid - 1]) {
                    right = mid - 1;
                } else if (arr[mid] > arr[mid + 1]) {
                    left = mid + 1;
                } else {
                    return mid;
                }
            }
            return left;
        }
    
        public static void printArray(int[] arr) {
            for (int i = 0; i != arr.length; i++) {
                System.out.print(arr[i] + " ");
            }
            System.out.println();
        }
    
        public static void main(String[] args) {
            int[] arr = { 6, 5, 3, 4, 6, 7, 8 };
            printArray(arr);
            int index = getLessIndex(arr);
            System.out.println("index: " + index + ", value: " + arr[index]);
    
        }
    

    注意:

    在取mid时,mid = right - ((right-left)>>1) 和left + ((right - left)>>1)不一样,第一种情况不行,因为比如right=5,left=2,mid=4,但实际mid=3

    相关文章

      网友评论

        本文标题:二分搜索

        本文链接:https://www.haomeiwen.com/subject/wgdxixtx.html