小白笔记只为记录自己学习的过程,内容不严谨之处还请大佬帮忙指出,不建议用来学习、借鉴
注意事项:
- 无需在意数列个数是奇数还是偶数;
- 判断条件;
- lf,r的缩小范围;
- 不同的范围有不同的写法(左闭右闭、左闭右开);
1.
无论是奇数还是偶数,其mid的结果没有差别;
如:偶数 lf = 0(实际为 第一个数),r = 7(实际为 第八个数);
mid = (lf + r) / 2 = 3(第四个数);需要甄别 5-8 位数
奇数 lf = 1; r = 7;
mid = (lf + r) / 2 = 4; 需要甄别 6-8 位数
奇数、偶数的差别便是奇数比偶数少甄别一位a[mid],但其mid进行改变的前提便是 a[mid] != m,所以那一位数不等于 m 时,a[mid] 是否多甄别一位对结果没有影响。
2. lf <= r
当lf == r时也是会有成立的情况,
如lf = 4,r = 5,a[mid] = 5,a[mid+1] = 6 ,mid = 4,m = 6;
……5(mid),6…… m = 6;
此时 m = 6 > 5 = a[mid] → lf = mid + 1 = 5,a[5] = 6;
此时 r = lf = mid,且a[mid] == m; 此时mid符合条件,但当判准中不存在 lf == r 的条件时,这一情况会被忽略
3.
当 m > mid 时,lf = mid + 1 ,因为此时的 a[mid] != m,那么mid不需要被甄别,mid舍弃
r 同理,条件满足时,r = mid - 1;
若mid后失去 +- 1 的运算,如当 lf = 6,r = 7, m > a[mid](lf 需要 = mid) 时,mid = 13 / 2 = 6,lf = mid = 6;又因为我们判断循环的条件为 lf <= r,失去+-1,对上述情况会造成死循环;
4.
当范围如[5,9),左闭右开的情况下,判断条件为lf < r,r取不到r本身,所以不存在lf == r的情况
且当需要 r 转换为mid时,r = mid,因为判断中 lf != r,所以当此时r = mid的mid是取不到的,若是-1就忽略掉一位mid前需要甄别的数字