跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java 算法:二分查找核心原理与经典例题

Java 语言中二分查找算法的核心原理,涵盖有序数组前提、左右指针收敛策略及防溢出技巧。通过四个经典例题(基础查找、查找首尾位置、搜索插入位置、求平方根),详细解析了不同场景下的边界处理与模板应用,帮助读者掌握二分查找的变体实现。

王者发布于 2026/3/30更新于 2026/7/1957 浏览

练习一 : 二分查找

704. 二分查找 - 力扣(LeetCode)

image

class Solution {
    public int search(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        int mid = 0;
        while (left <= right) {
            mid = left + (right - left) / 2; // 防止溢出
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else { // nums[mid] < target
                left = mid + 1;
            }
        }
        return -1;
    }
}

算法原理

  1. 数组必须有序
  2. 每次取中间位置,和目标值比较
  3. 比目标小 -> 去右边找
  4. 比目标大 -> 去左边找
  5. 直到找到或找不到

⭐⭐⭐ 练习二 : 在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

image

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int len = nums.length;
        int left = 0, right = len - 1;
        int mid = 0;
        int[] ret = {-1, -1};
        
        if (len == 0 || nums[len - 1] < target || nums[0] > target) {
            return ret;
        }
        
        // 找左端点
        int retLeft = 0;
        while (left < right) {
            mid = left + (right - left) / 2;
            // 找左端点时,如果存在则最后 mid 会落在 left 处,经过处理会让两个指针重合,退出循环,返回结果
            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        
        // 判断双指针重合处是否是端点
        if (nums[left] != target) {
            return ret;
        }
        retLeft = left;
        
        // 找右端点
        int retRight = 0;
        left = 0;
        right = len - 1; // 记得恢复指针
        while (left < right) {
            mid = left + (right - left + 1) / 2;
            // 找右端点时,如果存在则最后 mid 会落在 right 处,经过处理会让 left 和 right 重合,退出循环,返回结果
            if (nums[mid] <= target) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        retRight = right;
        
        // 经过找左端点后如果进入到寻找右端点,则数组中一定包含 target,此时不需要进行判断
        ret[0] = retLeft;
        ret[1] = retRight;
        return ret;
    }
}

算法原理

找左端点 :

  • 当 mid 落在 < target 处,要让 left 跳出非法区域 (left = mid + 1)
  • 当 mid 落在 >= target 处,要让 right 移到 mid 处 (right = mid),因为不能保证 mid - 1 和 mid 处是否是左端点
  • 当退出本次循环时,还需要判断一下双指针重合位置是否是 target

image

找右端点 :

  • 和找左端点同理;当 mid 落在 <= target 处,要让 left 移到 mid 处 (left = mid),因为不能保证 mid + 1 和 mid 处是右端点
  • 当 mid 落在 > target 处,要让 right 跳出非法区域 (right = mid - 1)
  • 能进入此次循环,意味着数组中一定包含 target,所以不需要判断双指针位置的合法性 (即使数组中只有一个 target)

image

注意

  1. 循环条件 : left < right

    因为只有当两指针重合时 (right == left),才能退出循环,判断合法性;如果写成 left <= right,则最后一步 right == left == mid 时会一直死循环

  2. mid 处理过程 (防止溢出和死循环)

    找左端点 → 用「左中位数」:mid = left + (right - left) / 2

    找右端点 → 用「右中位数」:mid = left + (right - left + 1) / 2

    左中数 : 处理后 mid 会更靠近 left,直到等于 left;目的是让 right 主动向左收敛,最终重合

    右中数 : 处理后 mid 会更靠近 right,直到等于 right;目的是让 left 主动向右收敛,最终重合

核心模板

image

练习三 : 搜索插入位置

35. 搜索插入位置 - 力扣(LeetCode)

image

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        int mid = 0;
        while (left < right) {
            mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        if (nums[left] < target) return right + 1;
        return left;
    }
}

练习四 : x 的平方根

69. x 的平方根 - 力扣(LeetCode)

image

class Solution {
    public int mySqrt(int x) {
        if (x == 0) return 0;
        int left = 1, right = x;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (mid == x / mid) return mid;
            else if (mid > x / mid) right = mid - 1;
            else left = mid + 1;
        }
        return right;
    }
}

目录

  1. 练习一 : 二分查找
  2. 算法原理
  3. ⭐⭐⭐ 练习二 : 在排序数组中查找元素的第一个和最后一个位置
  4. 算法原理
  5. 注意
  6. 核心模板
  7. 练习三 : 搜索插入位置
  8. 练习四 : x 的平方根
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • JavaScript 基础语法与 jQuery 使用指南
  • 前端面试复盘:从基础原理到工程化的核心考察点
  • AIGC 情感化智能客服实战:降低投诉率的技术方案
  • python-docx-template 模板化生成 Word 文档指南
  • OpenClaw 如何重新定义 AI 产品
  • 12 篇必读的大模型前沿论文
  • 产品经理在实际工作中使用 ChatGPT 的几种方式
  • AI 辅助 Java 开发实战:构建高可用电商系统核心架构
  • 无人机发展简史:从古代传说到现代飞行器设计
  • 华为 OD 技术面试:C++ 核心考点与特性解析
  • AI 赋能数据库运维:金仓 KES 的智能化未来
  • C++ 模拟实现二叉搜索树
  • SQL 表数据的增删与替换操作详解
  • DankDroneDownloader:大疆无人机固件下载工具
  • 基于 Higress 将 REST API 转换为 MCP Server 工具
  • Stack-Chan 机器人入门与开发实战
  • Ollama 本地 LLM 管理与 WebUI 及 Python/Java API 应用
  • Llama Factory 分布式训练配置详细步骤
  • DeepSeek-R1 大模型基于 MS-Swift 框架部署与微调实践
  • 自动化机器学习(AutoML)实战:从原理到企业级部署

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online