51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

给定一个升序排列的数组nums和一个目标值target,设计一个算法找到数组中第一个大于等于target的元素的下标,时间复杂度为O(log n)。

微软Software Engineer Intern难度:中等

答案

1) 【一句话结论】:这道题的核心是利用二分查找(Binary Search)在升序数组中高效定位第一个大于等于目标值的位置,时间复杂度为O(log n)。

2) 【原理/概念讲解】:首先,数组是升序排列的,这意味着数值从小到大有序,适合用二分查找这种分治策略。二分查找的核心是通过不断缩小搜索范围(左右指针)来快速定位目标。具体步骤:初始化左右指针left=0,right=n-1(n为数组长度);循环条件是left <= right;计算中间位置mid=(left+right)//2;比较nums[mid]与target:

  • 若nums[mid] < target:说明目标值在右半部分(数组升序,右半部分数值更大),此时左指针更新为left=mid+1;
  • 若nums[mid] >= target:此时mid可能是答案,但为了找到第一个大于等于target的元素,需要继续向左搜索(因为左边可能存在更小的满足条件的元素),因此右指针更新为right=mid-1,同时记录当前mid(用于后续可能的返回);
    当循环结束时,记录的mid即为第一个大于等于target的位置(若数组为空或无满足条件的元素,则返回-1或0,根据需求调整)。
    类比:就像在有序的字典里找单词,先看中间页,如果目标单词在中间页的右边,就翻到下一部分,否则继续看左边,直到找到第一个匹配的页码。

3) 【对比与适用场景】:

方法定义特性使用场景注意点
线性搜索从头到尾遍历数组,逐个比较元素与target时间复杂度O(n),空间复杂度O(1)数组无序或规模较小当数组无序时,无法利用有序性,效率低
二分查找利用数组有序性,通过分治策略缩小搜索范围时间复杂度O(log n),空间复杂度O(1)(迭代式)数组有序且规模较大必须保证数组有序,否则无法保证正确性

4) 【示例】:
数组nums = [1, 3, 5, 6, 7, 9],target = 5。

  • 初始:left=0, right=5
  • 第一次循环:mid=(0+5)//2=2,nums[2]=5 >=5 → 记录mid=2,right=1
  • 第二次循环:left=0, right=1 → mid=(0+1)//2=0,nums[0]=1 <5 → left=1
  • 第三次循环:left=1, right=1 → mid=1,nums[1]=3 <5 → left=2
  • 第四次循环:left=2, right=1 → 循环结束(left>right)
  • 返回记录的mid=2,即第一个大于等于5的元素(5)的下标是2。

另一个例子:target=6,过程类似,最终返回3(对应nums[3]=6)。

5) 【面试口播版答案】:
“这道题需要用二分查找来解决,因为数组是升序排列的,时间复杂度要求O(log n)。核心思路是维护左右指针,每次计算中间位置,比较中间值和目标值:如果中间值小于目标值,说明目标在右半部分,左指针右移;如果中间值大于等于目标值,记录当前中间位置,然后右指针左移,继续向左搜索,直到左指针超过右指针,此时记录的中间位置就是第一个大于等于目标值的元素的下标。”

6) 【追问清单】:

  • 问题1:如果数组中有重复元素,如何处理?
    回答要点:当中间值大于等于目标值时,先记录中间位置,然后右指针左移,继续向左搜索,确保找到的是最左边的满足条件的元素。
  • 问题2:如果数组为空,应该返回什么?
    回答要点:根据需求,通常返回-1(表示未找到)或0(根据定义调整)。
  • 问题3:如果时间复杂度必须严格O(log n),不能使用额外空间,如何实现?
    回答要点:使用迭代式二分查找,仅用左右指针和中间变量,不需要额外数组或哈希表。
  • 问题4:如果数组不是升序排列,还能用二分查找吗?
    回答要点:不能,二分查找的前提是数组有序(升序或降序),否则无法保证正确性。
  • 问题5:如果目标值不存在于数组中,如何返回结果?
    回答要点:返回最后一个大于等于目标值的位置(即循环结束后记录的mid,若未找到则返回-1)。

7) 【常见坑/雷区】:

  • 指针更新错误:当nums[mid] < target时,左指针移动到mid+1,但右指针未更新,导致死循环。
  • 忽略左半部分搜索:当nums[mid] >= target时,直接返回mid,忽略了左边可能存在更小的满足条件的元素,导致错误。
  • 数组边界处理不当:初始左右指针或循环条件错误,导致越界或未找到元素。
  • 混淆“大于等于”与“等于”:当目标值等于数组中的某个值时,需确保找到的是最左边的该值,而非任意一个。
  • 未考虑重复元素的情况:当数组有重复元素时,若仅记录一次满足条件的mid,可能导致返回的不是第一个大于等于的元素。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1