今天比前天的我更加了解了二分查找的运用,
1.搜索旋转排序数组
while的条件通常写成(l<r),但是这里不行!可能存在特殊情况,当mid前面的数是有序的,就会找mid之前的数,如果恰好需要找的数在mid之后就找不到数组中存在的数。
mid=l+r+1>>1;是向上取整,防止数组中只有两个元素时就会使r(最左端的数)往右靠;使得r=l
最后返回-1值。这题不只有这两个小细节,还有一个很难想到的一点。怎么判断边界l或r的移动(也就是check(x)),是根据旋转一次之后判断mid之前是否有序否则找无序的那一边。
2.搜索旋转排序数组
错误
和上一题思路差不多,但是数组的元素不是互不相同的,可能出现右图的情况。这里只需判断大端、小端和mid是否相同,相同就缩小查找的范围。
这里可以把mid看成数组中最小的数,套用二分查找就可以了。
4.爬楼梯
我这里还有一种算法,但是超时了。
5.斐波那契数
8.猜数字
9. 拿硬币