尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

二分查找刷题总结

二分查找刷题总结
📅 发布时间:2026/6/20 0:29:26

推荐使用闭区间的方式去做二分查找的题目

如果数量比较少,那么建议使用顺序遍历的方式

因此二分结束时一定有: i指向首个大于 target 的元素,j指向首个小于 target 的元素。易得当数组不包含 target 时,插入索引为

162. 寻找峰值

寻找最大值,这个也可以理解,嗯

大的一侧为什么一定有峰值?注意题目条件,在题目描述中出现了 nums[-1] = nums[n] = -∞,这就代表着 只要数组中存在一个元素比相邻元素大,那么沿着它一定可以找到一个峰值

沿着大的方向走,肯定会存在一个峰值

class Solution {public int findPeakElement(int[] nums) {int l = 0, r = nums.length - 1;while (l < r) {int mid = l + ((r - l) >> 1);if (nums[mid] < nums[mid + 1]) {l = mid + 1;} else {r = mid;}}return l;}
}

33. 搜索旋转排序数组

我们将数组从中间分开成左右两部分的时候,一定有一部分的数组是有序的

当前 mid 为分割位置分割出来的两个部分 [l, mid] 和 [mid + 1, r] 哪个部分是有序的,并根据有序的那个部分确定我们该如何改变二分查找的上下界,因为我们能够根据有序的那部分判断出 target 在不在这个部分:

  • 如果 [l, mid - 1] 是有序数组,且 target 的大小满足 [nums[l],nums[mid]),则我们应该将搜索范围缩小至 [l, mid - 1],否则在 [mid + 1, r] 中寻找。
  • 如果 [mid, r] 是有序数组,且 target 的大小满足 [nums[mid+1],nums[r]],则我们应该将搜索范围缩小至 [mid + 1, r],否则在 [l, mid - 1] 中寻找。

public int search(int[] nums, int target) {int lo = 0, hi = nums.length - 1, mid = 0;while (lo <= hi) {mid = lo + (hi - lo) / 2;if (nums[mid] == target) {return mid;}if (nums[mid] >= nums[lo]) { // left到mid是有序数据if (target >= nums[lo] && target < nums[mid]) {hi = mid - 1;} else {lo = mid + 1;}} else { // mid --> right是有序数组if (target > nums[mid] && target <= nums[hi]) {lo = mid + 1;} else {hi = mid - 1;}}}return -1;
}

34. 在排序数组中查找元素的第一个和最后一个位置

ACE了

class Solution {public int[] searchRange(int[] nums, int target) {return new int[] { left(nums, target), right(nums, target) };}public int left(int[] nums, int target) {int i = binarySearch(nums, target);if (i == nums.length || nums[i] != target) {return -1;}return i;}public int right(int[] nums, int target) {int i = binarySearch(nums, target + 1);int j = i - 1;if (j == -1 || nums[j] != target) {return -1;}return j;}public int binarySearch(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1;} else {right = mid - 1;}}return left;}
}

153. 寻找旋转排序数组中的最小值

解题总结:

1、边界条件判断

2、如果单调的,直接返回第一个元素即可

3、动态调整small,当前最small为nums[0]

4、如果大于=small,那么缩小左边的边界

5、如果小于small,那么缩小右边的边界,然后更新small的值

6、最后循环结束的时候,l就指向第一个大于=small的元素。

class Solution {public int findMin(int[] nums) {int l = 0;int r = nums.length - 1;if (nums.length == 1) {return nums[0];}if (nums[0] < nums[nums.length - 1]) {return nums[0];}int small = nums[0];while(l <= r) {int m = (l + r) / 2;if (nums[m] >= small) {l = m + 1;} else {r = m - 1;small = nums[m];}}return nums[l];}
}

相关新闻

  • zjoi2019 语言
  • 2025-07-21-Mon-T-RocketMQ
  • P24_现有网络模型的使用及修改

最新新闻

  • Godot 4开源回合制RPG实战指南:构建专业级战斗与对话系统
  • 论文写作进阶:构建清晰一致的数学符号系统
  • MC9S12VR ATD模块高精度设计:从手册规范到电路实战
  • 2026全球化仓储软件(WMS)哪家好?行业选型参考 - 品牌排行榜
  • 告别臃肿:3个理由让你立即切换到GHelper控制华硕笔记本
  • 2026苏州擅长协议离婚谈判的律师推荐 - 品牌排行榜

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号