5 二分查找算法应用

在有序数组查找特定元素

java 复制代码
/**
 * 二分查找
 * 对有序的数组,查找某个元素所在位置
 */
public class Code1_BinarySearch {
    public static void main(String[] args) {
        int[] arr = {1, 3, 5};
        System.out.println(query(arr, 6));
        System.out.println(query(arr, 1));
        System.out.println(query(arr, 3));
    }

    /**
     * 二分查找
     * @param arr 有序数组
     * @param n 查找元素
     * @return 返回位置
     */
    public static int query(int[] arr, int n) {
        if (arr == null || arr.length < 1) {
            return -1;
        }
        int l = 0;
        int r = arr.length - 1;
        while (l <= r) {
            int m = (l+r) / 2;
            if (arr[m] == n) {
                return m;
            } else if (arr[m] < n) {
                l = m + 1;
            } else {
                r = m - 1;
            }
        }
        return -1;
    }

}

在有序数组查找 >= n 的最左侧位置

java 复制代码
/**
 * 在有序数组查找 >= n 的最左侧位置
 * 基于二分查找算法实现
 */
public class Code2_BinarySearchGrateLeft {
    public static void main(String[] args) {
        System.out.println(binarySearchGl(new int[]{6, 9, 10},1));
        System.out.println(binarySearchGl(new int[]{6, 9, 10},6));
        System.out.println(binarySearchGl(new int[]{6, 9, 10},9));
        System.out.println(binarySearchGl(new int[]{6, 9, 10},10));
        System.out.println(binarySearchGl(new int[]{6, 9, 10},11));
    }

    //数组没有>=n的元素返回-1,有则返回>=n的最左侧值
    public static int binarySearchGl(int[] arr, int n) {
        int l = 0;
        int r = arr.length - 1;
        int t = -1;
        while (l <= r) {
            int m = (l + r) / 2;
            if (arr[m] < n) {
                l = m + 1;
            } else if (arr[m] >= n) {
                r=m-1;
                t=m;
            }
        }
        return t;
    }
}

有一个无序的数组,相邻元素不重复,在这个数组查找一个局部最小值

java 复制代码
/**
 * 有一个无序的数组,相邻元素不重复,在这个数组查找一个局部最小值
 */
public class Code3_LocalOneMinSearch {
    public static void main(String[] args) {
//        System.out.println(search(new int[]{1,2,3}));
//        System.out.println(search(new int[]{3,2,1}));
//        System.out.println(search(new int[]{3}));
        System.out.println(search(new int[]{10,5,7,61,100}));


    }

    public static int search(int[] arr) {
        if (arr == null || arr.length == 0) {
            return -1;
        }
        int len = arr.length;
        if (len == 1) {
            return 0;
        }
        if(arr[0]<arr[1]){
            return 0;
        }
        if(arr[len-1]<arr[len-2]){
            return len-1;
        }
        int l=0;
        int r=len-1;
        while (l<r-1){
            int m=(l+r)/2;
            if(arr[m]<arr[m-1] && arr[m]<arr[m+1]){
                return m;
            }
            if(arr[m]>arr[m-1]){
                r=m-1;
            }
            if(arr[m]>arr[m+1]){
                l=m+1;
            }
        }
        return arr[l]<arr[r]?l:r;
    }
}
相关推荐
欧阳x天3 小时前
堆(超详解)
数据结构
郑..方..醒3 小时前
java实现ofd转pdf
java·pdf
道可到3 小时前
阿里面试原题 java面试直接过06 | 集合底层——HashMap、ConcurrentHashMap、CopyOnWriteArrayList
java·后端·面试
狼爷3 小时前
从面试翻车到原理吃透:详解 synchronized 锁不住 Integer 的真相
java
麦麦鸡腿堡3 小时前
Java的封装
java·开发语言
wearegogog1233 小时前
Centos7下docker的jenkins下载并配置jdk与maven
java·docker·jenkins
青云交3 小时前
Java 大视界 -- Java 大数据在智能家居设备联动与场景自动化中的应用
java·大数据·智能家居·数据采集·设备联动·场景自动化·逻辑实现
过往入尘土3 小时前
深入探索现代前端开发:从基础到架构的完整指南
前端·人工智能·算法·前端框架
野犬寒鸦3 小时前
从零起步学习MySQL || 第一章:初识MySQL及深入理解内部数据类型
java·服务器·数据库·后端·mysql