这一节主要来研究一下二分查找,二分查找的思想很简单,但是在实现时需要注意几个问题:
- 在计算mid时不能使用mid=(l+h)/2,因为这样可能会导致加法溢出,应该使用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
求开方:LeetCode第69题
求开方
代码
摆硬币:LeetCode第441题
摆硬币
题目描述:第i行摆i个,统计能够摆满的行数
代码
有序数组的Single Element:LeetCode第540题
有序数组
题目描述:有序数组只有一个数不出现两次,找出这个数
代码