数组:leetcode704.二分查找

127 阅读1分钟

使用条件

无重复有序 数组

算法思想

将表中间位置记录(mid)与查找关键字(target)比较,如果两者相等,则查找成功;否则利用中间位置记录(mid)将表分成前、后两个子表,如果查找关键字(target)小于中间位置记录(mid)的关键字,则进一步查找前一子表,否则进一步查找后一子表。

重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

难点分析

对于二分查找算法,入手点和难点在于搜索区间的确定,常规来讲主要分为两类

  • 左闭右闭 区间
  • 左闭右开 区间。

左闭右闭区间

由于搜索区间两端闭合,即左右区间两端都可以取到值。因此有,

  • high = nums.size()-1
  • while(low<=high)
  • if(target<nums[mid]) high = mid-1;
  • if(target>nums[mid]) low = mid+1;

左闭右开区间

由于搜索区间左端闭合右端开口,即左端点可以取到搜索值,而右端点无法取到搜索值。若想使得区间包涵所有搜索值,左端点要取搜索区间第一个值,而右端点应该取最搜索区间最后一个值的下一个。因此有,

  • high = nums.size()

  • while(low<high)

  • if(target<nums[mid]) high = mid;
    此时目标值target小于mid所指位置,且mid所指值不是目标值,应查找mid之前的子表,而且在左闭右开区间条件下,右端点high指向搜索区间最后一个值的下一个值,因此high指向mid.

  • if(target>nums[mid]) low = mid+1;