逢试必考的二分查找(算法村第九关青铜挑战)

位运算

除法在计算机中效率很低,一般改用 >> x ,意思是二进制数的每个位右移 x 位。从十进制的角度看, x 是以 2 为底的指数,这个指数就是除数。

java 复制代码
//等价式
mid = (low + high) / 2;
mid = low + high >> 2;	//效率提高
mid = low + (high - low >> 2);	//防止(low + high)溢出

在 Java 中,位运算符 >> 的优先级低于加法运算符 +,所以需要使用括号来保证正确的优先级

用递归实现二分查找

java 复制代码
/**
 * @param arr 升序数组
 */
public static int binarySearch(int[] arr, int low, int high, int target)
{
    if(low > high)
        return -1;  //没有找到返回-1

    int mid = low + (high - low >> 1);

    if(arr[mid] == target)
        return mid; //返回目标值的位置

    else if(arr[mid] < target)
        return binarySearch(arr,mid + 1, high, target); //向右寻找

    else
        return binarySearch(arr, low, mid - 1, target); //向左寻找
}

有重复元素的二分查找

迭代实现

java 复制代码
public static int binarySearch(int[] arr, int target)
{
    int low = 0;
    int high = arr.length - 1;

    // 使用二分查找法查找target
    while (low <= high)
    {
        int mid = low + (high - low >> 1);

        // 如果中间元素等于target,则返回中间元素索引
        if (arr[mid] == target)
        {
            // 如果中间元素不是第一个元素,则继续向前查找
            while (mid != 0 && arr[mid] == target)
                mid--;

            // 如果中间元素是第一个元素,则返回0
            if (mid == 0)
                return 0;
            else
                return mid + 1;
        }
        // 如果中间元素小于target,则将low移动到mid+1
        else if (arr[mid] < target)
            low = mid + 1;
        // 如果中间元素大于target,则将high移动到mid-1
        else
            high = mid - 1;
    }

    // 如果查找结束没有找到target,则返回-1
    return -1;
}
相关推荐
疯狂打码的少年23 分钟前
【数据结构】板块总结 + 下期预告(数据库技术)
数据结构·笔记·算法
郝学胜_神的一滴28 分钟前
Effective Python 条款 2:遵循 PEP 8 编码风格,写出高质量 Python 代码
python·算法
郝学胜-神的一滴29 分钟前
Effective Python 条款 1:确认你正在使用的 Python 版本
开发语言·数据结构·python·程序人生·算法
sel_937 分钟前
【多轮对话论文导读(二)】多轮对话与LLM Agent论文阅读:长期记忆、多轮评估与Agent训练
人工智能·深度学习·算法·语言模型·自然语言处理
一木 之林1 小时前
五、C++新特性、关键字与编译原理
java·jvm·算法
万法若空2 小时前
对数恒等式
人工智能·算法·机器学习
AI小码2 小时前
如何让AI帮你构建项目?七级方法
人工智能·算法·计算机·ai·程序员·大模型·编程
1000世界小札2 小时前
排序算法全景总结:从 O(n²) 到 O(n log n),再到线性时间(附完整对比与选型指南)
数据结构·算法·排序算法
一直C3 小时前
【Linux应用编程】深入理解Linux多任务机制:进程原理、状态转换与进程控制实战
linux·开发语言·算法·ubuntu·vim·visual studio code
玉树临风ives3 小时前
atcoder ABC 472 题解
数据结构·c++·算法