思路
- while判定条件的选择,注意最外层的return的内容就好。下面提供了两个代码版本。
- 计算 mid 时需要防止溢出(对应类型【如本例中的int】可能存不下),即 mid=left+(right-left)/2。
- 如何更改二分区间
重点说第三点,一开始的选择是当num在mid左边时直接将mid给right,反之num在mid右边将mid给left。但是这就出现了一个问题。例如:
数组元素为 1 3 5 的时候,如果你想要找4,那么:
- 第一次left = 0, right = 2, mid = 1;
- 第二次left = 1, right = 2, mid = left+(right-left)/2 = 1。
可以看出mid指向的下标是没有更改的,因此程序会陷入一直以下标1为left、mid,以下标2为right的尴尬情况——死循环。如果只是单纯的将mid的值粗暴的赋给left或者right,是没法解决问题的,因为会在一个重复的区间不断查找——当mid所指向的数组元素不为num时,mid位置已经可以被排除了,其不应该作为下一次