zoukankan      html  css  js  c++  java
  • 二分查找

    1. 标准的二分查找

    即从两边一步一步的向中间靠拢,查找指定的某一个值

    public boolean binarySearch(int[] nums, int target) {
        int start = 0, end = nums.length - 1;
    
        while(start <=  end){
            int mid = (start + end) / 2;
    
            if(nums[mid] == target){
                return true;
            } else if(nums[mid] < target){
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }
    
        return false;
    }
    

    2. 查找小于等于指定值的最大值,大于等于指定值的最小值

    小于等于指定值的最大值

    public int binarySearch(int[] nums, int target) {
        int start = 0, end = nums.length - 1;
    
        while(start <  end){
            int mid = (start + end + 1) / 2;
    
            if(nums[mid] > target){
                end = mid - 1;
            } else {
                start = mid;
            }
        }
    
        if(nums[start] > target){
            return -1;
        }
        return start;
    }
    

    注意:

    1. 为什么 start < end,并且 mid = (start + end + 1) / 2;
    . . . . . . 3 6 . . .
    . . . . . . k k + 1 . . .

    假设查询小于等于 5 的最大值,此时 start = k,end = k + 1;若 mid = (start + end)/ 2;则程序陷入死循环,改成 mid = (start + end + 1) / 2;则可以取到索引较大的那一项。

    当 start 等于 end 的时候,即为可能的答案。

    1. 若无解,则循环结束之后 start 仍未发生改变。

    大于等于指定值的最小值

    public int binarySearch(int[] nums, int target) {
        int start = 0, end = nums.length - 1;
    
        while(start <  end){
            int mid = (start + end) / 2;
    
            if(nums[mid] < target){
                start = mid + 1;
            } else {
                end = mid;
            }
        }
    
        if(nums[end] < target){
            return -1;
        }
        return start;
    }
    

    分析同上,计算中值的时候同样避免了死循环。

  • 相关阅读:
    GolandQuick编辑器快捷键
    GitStand
    高阶函数
    文本和字节序列
    元组用法
    映射的弹性键查询
    字典的setdefault()
    数组、内存视图、双向队列
    Python之random.seed()用法
    用bisect来管理已排序的序列
  • 原文地址:https://www.cnblogs.com/zcxhaha/p/11390740.html
Copyright © 2011-2022 走看看