Description
使用二分查找的两道题,包括了二分查找原理即题型汇总。
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array.Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
The array may contain duplicates.
我就说怎么这么熟悉呢, 见[leetcode81]Search in Rotated Sorted Array II.
Solution
第1题,第2题这种题目放出来,必然是要用比较优的方法来解决了,对于这种可以看做是有序序列的查找问题一般就是用二分查找来解决,这里也会总结所有二分查找的题目。
二分查找原理
算法第4版P15中提到
第一步:接收给定的有序序列
第二步:取其中间的数与给定数判断,如果给定数小于中间的数,将序列的左半部分传给第一步;如果给定数大于中间的数,将序列的右半部分传给第一步;否则返回中间数的下标
其中mid的求解是left+(right-left)/2
,因此对于偶数列,中间取左边
[leetcode 153]Find Minimum in Rotated Sorted Array
没有重复的元素,不会涉及到相等的问题,这道题的思路就是,如果中间的数大于数组头元素,那么桌板部分最小值必然是数组头元素,继续判断右半部分即可;如果中间的数小于数组头元素,那么右边的最小值一定是中间的数,继续判断左半部分即可。代码写的有点啰嗦,可以优化的:
[leetcode 154]Find Minimum in Rotated Sorted Array II
出现了重复的元素,这样就需要考虑重复的情况。
思路:中间的数和最后面的数相比,如果中间的数大于最后面的数,说明最小值在中间数的下一个元素到最后元素之间,那么让start指针指向中间数的下一个数;如果中间的数小于最后面的数,那么右半部分最小值必然是中间的数,即整个数组的最小值必然在最前面的数到中间的数之间,start不用变,只用将end向前移到mid指针处即可;如果中间的数等于最后面的数,这时只需要将最后面的数前移即可【这里出现的两种情况([3,4,3,3,3],[3,3,3,2,3])】。注意返回的是最前面的数。
[leetcode 69]Sqrt(x)
Implement int sqrt(int x).
Compute and return the square root of x.
x is guaranteed to be a non-negative integer.
这道题严格要求时间复杂度为O(lgn),所以一般的遍历是无法解决的。思路是,从0到x中选取一个数mid,使得mid满足,然后用二分查找进行查找即可:
[leetcode 81]Search in Rotated Sorted Array II
Follow up for “Search in Rotated Sorted Array”:
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Write a function to determine if a given target is in the array.
The array may contain duplicates.
这道题目和前面的完全一样,前面的题目是要找最小值,这里是要找目标值,如下:
长期更新!