题目:
最开始解法:
对于[3,4,5,1,2],我的想法是找到一个边界,当一个元素比它前一个元素小的时候。那么这个数就是最小值。但是如果这个数组是[1,2,3,4,5]呢?即没有进行旋转,此时上面的做法就不成立了,需要比较第一个和最后一个元素,如果小于等于最后一个元素的话,就说明最小的是第一个元素。
这样的复杂度是O(n)。
其实后面想了下,最后不用经过判断再返回第一个元素了,可以直接返回numbers[0]
看了官网之后的解答:
因为旋转数组是由两个有序数组组合而成,因此适合用二分法来查找
1.一个指针low指向开头,指针high指向结尾,指针bet(low+(high-low)/2) 指向中间。比较high指针指向的元素和中间bet指向的元素,会出现下面三种情况:
(1)num[high]>num[bet]说明最小元素在bet的左边,因此现在只要将注意力放在low和bet之间就好了。
(2)num[high]<num[bet]说明最小元素在bet的右边,因此现在只要将注意力放在bet+1(因为此时num[bet]肯定不是最小元素)肯定不是和high之间就好了。
(3)num[high]==num[bet],假如数组为[1,1,1,0,1,1],此时就不知道该把bet到底是0左边的还是右边的。但是可以确定high指向的元素不是最小元素,因此可以high–。
代码为: