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;
    }
}
相关推荐
风吹迎面入袖凉2 分钟前
【Redis】Redisson分布式锁原理
java·服务器·开发语言
QCzblack2 分钟前
BugKu BUUCTF ——Reverse
java·前端·数据库
Orange_sparkle6 分钟前
learn claude code学习记录-S02
java·python·学习
李白你好7 分钟前
Java GUI-未授权漏洞检测工具
java·开发语言
会编程的土豆23 分钟前
日常做题 vlog
数据结构·c++·算法
aq553560027 分钟前
四大编程语言对比:PHP、Python、Java、易语言
java·python·php
Omigeq1 小时前
1.4 - 曲线生成轨迹优化算法(以BSpline和ReedsShepp为例) - Python运动规划库教程(Python Motion Planning)
开发语言·人工智能·python·算法·机器人
成为大佬先秃头1 小时前
前后分离项目:整合JWT+Shiro
java·springboot·shiro·jwt
网络工程小王1 小时前
【大模型(LLM)的业务开发】学习笔记
人工智能·算法·机器学习
y = xⁿ1 小时前
【Leet Code 】滑动窗口
java·算法·leetcode