题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之外数组的旋转。输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
这道题最简单的方法当然是直接遍历,然后找出最小的即可,时间复杂度是O(n)。但是这种方法并没有利用到旋转数组的特性,更好的方法是用类似于“二分查找”的方法。
旋转数组是有原先的有序数组做一定处理得到的,所以旋转数组以最小元素分割,两边都具有有序性,根据这个特性可以不断缩小查找的范围。
类似于二分查找,不断比较中间的值mid
和最右边的值hi
,如果mid
大于hi
,说明最小元素肯定在这两个数之间,也即右边;如果mid
等于hi
,那么我们无法判断最小元素在哪一边,只能按照顺序查找,将hi
减一;如果mid
小于hi
,说明最小元素肯定在另外一边,也即左边,这个时候只需要更新一下hi
即可。
1 | import java.util.ArrayList; |
上述思路最佳的时间复杂度是O(logn)
,最坏复杂度是O(n)
,这道题算是二分查找的一个变形。