题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
方法
二分查找实现$O(n \log n)$
两个指针分别总是第一个和最后一个元素。
- 如果确定旋转了n>0个元素,第一个元素总是大于或等于最后一个元素(循环条件)
- 如果数组旋转了n=0个元素,则数组本身就是递增数组,最小元素就是第一个元素
- 如果中间元素位于前面的递增子数组,则mid要大于或等于front,此时最小元素位于中间元素之后
- 如果中间元素位于后面的递增子数组,则mid要小于或等于rear,此时最小元素应该位于中间元素的前面或自己本身
- 如果两个指针指向的数字和中间元素相等,只能采用顺序查找的方法
第一个指针总是指向第一个递增子数组的元素,第二个指针总是指向第二递增子数组的元素。最终第一个指针指向第一个递增子数组的最后一个元素,第二个指针指向第二个递增子数组的第一个元素。两个指针相邻,第二个指针指向的元素就是最小元素。
- 循环条件:数组中第一个元素总是大于或等于最后一个元素
- 循环结束条件:第一个指针和第二个指针相邻,第二个指针指向的元素就是最小元素
- 边界测试:输入数组是一个升序数组;只包含一个数字的数组
- 难点:数组中可能存在重复的数字,数组可能旋转了0和数字
1 | # -*- coding:utf-8 -*- |