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

位运算

除法在计算机中效率很低,一般改用 >> 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;
}
相关推荐
iuu_star5 分钟前
C语言数据结构-顺序查找、折半查找
c语言·数据结构·算法
Yzzz-F12 分钟前
P1558 色板游戏 [线段树 + 二进制状态压缩 + 懒标记区间重置]
算法
漫随流水19 分钟前
leetcode算法(515.在每个树行中找最大值)
数据结构·算法·leetcode·二叉树
mit6.8241 小时前
dfs|前后缀分解
算法
扫地的小何尚1 小时前
NVIDIA RTX PC开源AI工具升级:加速LLM和扩散模型的性能革命
人工智能·python·算法·开源·nvidia·1024程序员节
千金裘换酒2 小时前
LeetCode反转链表
算法·leetcode·链表
byzh_rc3 小时前
[认知计算] 专栏总结
线性代数·算法·matlab·信号处理
qq_433554543 小时前
C++ manacher(求解回文串问题)
开发语言·c++·算法
歌_顿4 小时前
知识蒸馏学习总结
人工智能·算法
闲看云起4 小时前
LeetCode-day6:接雨水
算法·leetcode·职场和发展