二分法核心与注意事项

一. 在计算 mid 时不能使用 mid = (l + h) / 2 这种方式

因为 l + h 可能会导致加法溢出,应该使用 mid = l + (h - l) / 2

二. 对 h 的赋值和循环条件有关

当循环条件为 l <= h 时,h = mid - 1;

当循环条件为 l < h 时,h = mid。

解释如下:在循环条件为 l <= h 时,如果 h = mid,会出现循环无法退出的情况,例如 l = 1,h = 1,此时 mid 也等于 1,如果此时继续执行 h = mid,那么就会无限循环;在循环条件为 l < h,如果 h = mid - 1,会错误跳过查找的数,例如对于数组 [1,2,3],要查找 1,最开始 l = 0,h = 2,mid = 1,判断 key < arr[mid] 执行 h = mid - 1 = 0,此时循环退出,直接把查找的数跳过了。

三. l 的赋值一般都为 l = mid + 1。
有的题目可能有特殊需要

例如:有序数组的有序数组的 Single Element。这时要保证l、h、mid都是偶数,那么l = mid + 2; 

题目来源于LeetCode:https://leetcode.com/problems/single-element-in-a-sorted-array/

四. 大家都知道如果查询到了,直接返回mid相关的数据即可,如果没找到,是返回h 还是l 呢

如果只是一般的l = mid + 1; h = mid - 1(循环条件为l <= h),最后结束while循环l > h

扫描二维码关注公众号,回复: 8802277 查看本文章

1. 题目要求区较小值(sqrt开方只能下取整、摆硬币不能算最后未摆完的那行)——return h;

2. 题目需要用二分法插入数据,但是整个序列每个位置的值越小越好(求最长递增序列长度)——return l;

3. 若循环条件为while(h > l),结束循环时h = l,无论返回哪个都可以。

发布了28 篇原创文章 · 获赞 2 · 访问量 6572

猜你喜欢

转载自blog.csdn.net/Ariel_x/article/details/87173358
今日推荐