无序数组用线性扫描找首次出现位置,有序数组用两次二分查找确定左右边界;关键注意边界处理、mid防溢出及结果校验。

直接用数组做高效查找,关键看数据是否有序、查的是单个值还是边界位置。无序数组只能线性扫描;有序数组才能用二分查找快速定位首次出现位置。
无序数组:用一次遍历锁定首次出现索引
如果数组没排序,没法跳过元素,必须从头开始比对。找到第一个匹配项就立刻返回,不继续往后走——这是“首次出现”的核心逻辑。
- 用 for 循环或增强 for 遍历,遇到 target 就 return 当前下标
- 循环结束都没找到,return -1 表示不存在
- Java 示例中,对二维无序数组找数字 3,需用带标签的 break 或布尔标志控制双层跳出
有序数组:用两次二分查找分别定位左右边界
当数组升序排列且含重复元素时,“首次出现”本质是左边界。不能用普通二分查到就停,得继续往左缩范围,直到确认左边再无相同值。
- 第一次二分:找第一个 ≥ target 的位置(即左边界),mid == target 时不返回,而是 right = mid - 1 继续向左探
- 第二次二分:找第一个 > target 的位置,再减 1 就是右边界
- 两个结果需校验:左边界索引处的值必须等于 target,否则说明 target 根本不在数组中
实战中容易忽略的关键细节
写查找逻辑时,边界处理和条件判断稍有偏差就会漏掉首个或越界。几个实际要注意的点:
- 计算 mid 用 left + (right - left) / 2,避免整数溢出
- while 条件用 left
- 更新指针时,left = mid + 1 和 right = mid - 1 要严格对应比较逻辑,别写反
- 二维数组查找首次出现,优先转成一维逻辑处理,或用行主序遍历加提前退出
不复杂但容易忽略










