二分算法的变种----查找递增可重复数组边界

public class test {
    //数组长度a,b,c为8,d为7;
    static int[] a = {3,5,8,8,8,9,9,10};
    static int[] b = {8,8,8,8,8,8,8,8};
    static int[] c = {0,0,0,0,0,0,0,0};
    static int[] d = {0,0,0,0,0,0,0};
    public static void main(String[] args) {
        int target = 0;
        System.out.println("左边索引为:" + foundleft(target,d));
        System.out.println("右边索引为:" + foundright(target,d));
    }

    //要求时间复杂度为:log2n  --->  使用二分查找;
    //基本想法:不管是否找到 target值,都移动左右索引,直到左右索引重合;最后输出条件:索引重合&&索引处的数据为target;

    private static int foundleft(int target,int[] arr) {
        int left = 0,right = arr.length - 1;
        while (left != right){
            int mid = (left + right) / 2;
            if (target <= arr[mid]){
                right = mid;
            } else{
                left = mid;
            }
            if (right - left == 1 && arr[left] == target)
                return left;
            if(right - left == 1 && arr[right] == target)
                return right;
            if (right - left == 1)
                return -1;
        }
        return left;
    }

    private static int foundright(int target,int[] arr) {
        int left = 0,right = arr.length - 1;
        while (left != right){
            int mid = (left + right) / 2;
            if (target < arr[mid]){
                right = mid;
            } else{
                left = mid;
            }
            if(right - left == 1 && arr[right] == target)
                return right;
            if (right - left == 1 && arr[left] == target)
                return left;
            if (right - left == 1)
                return -1;
        }
        return right;
    }
}

上面的注释中说到基本想法:等到索引重合无法实现,不论是奇数个还是偶数个查找,最终都会以左右索引差1结束。因为当right - left==1时,mid与right或left永远相等。

可以进一步优化代码和效率:(主要是方法那部分)

private static int foundleft(int target,int[] arr) {
        int left = 0,right = arr.length - 1;
        while (right - left > 1){
            int mid = (left + right) / 2;
            if (target <= arr[mid]){
                right = mid;
            } else{
                left = mid;
            }
        }
        if (arr[left] == target)
            return left;
        if(arr[right] == target)
            return right;
        return -1;
    }

    private static int foundright(int target,int[] arr) {
        int left = 0,right = arr.length - 1;
        while (right - left > 1){
            int mid = (left + right) / 2;
            if (target < arr[mid]){
                right = mid;
            } else{
                left = mid;
            }
        }
        if(arr[right] == target)
            return right;
        if (arr[left] == target)
            return left;
        return -1;
    }
}

相关推荐

  1. bisect --- 数组二分查找算法

    2024-03-27 10:20:04       51 阅读
  2. 算法-数组二分查找

    2024-03-27 10:20:04       49 阅读
  3. 二分查找边界问题是怎么产生

    2024-03-27 10:20:04       33 阅读
  4. 二分查找算法

    2024-03-27 10:20:04       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 10:20:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 10:20:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 10:20:04       87 阅读
  4. Python语言-面向对象

    2024-03-27 10:20:04       96 阅读

热门阅读

  1. 算法打卡day18

    2024-03-27 10:20:04       43 阅读
  2. 握手和挥手

    2024-03-27 10:20:04       41 阅读
  3. npm常用命令详解

    2024-03-27 10:20:04       42 阅读
  4. Excel 导入、导出的封装

    2024-03-27 10:20:04       37 阅读
  5. 【go-工具】pprof

    2024-03-27 10:20:04       36 阅读
  6. 如何获取iOS手机上的APP崩溃日志?

    2024-03-27 10:20:04       35 阅读
  7. 22套软件研发文档模板下载(实用版)

    2024-03-27 10:20:04       42 阅读
  8. 【vue】computed和watch的区别和应用场景

    2024-03-27 10:20:04       44 阅读
  9. 机器学习:智能时代的核心引擎

    2024-03-27 10:20:04       46 阅读