题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
题目分析
根据题目,非减排序意思就是相邻两元素中左边元素时小于等于右边的,关键就在于这个等于了,如同数组[1,1,2,2,3,5,5]就是一个非减排序了。而这道题目就是将这样一个数组的前面一部分放到了末尾,然后求最小值,这该怎么求呢?
我们可以发现,即使是将前面一部分放到了数组末尾,但是两部分各自都肯定是非减排序的,也就是非严格升序。既然有序,那么就可以考虑二分法了,只不过这里的二分法会有些变化。
二分法的关键就是根据区间中点值的情况去收缩区间。
而在这道题中,以[5,5,6,7,7,9,1,1,2,4]为例,其中[5,5,6,7,7,9]是一部分,[1,1,2,4]又是一部分,那么我取的重点值肯定就是在这两部分之中了,那到底在哪一部分呢?就可以有以下情况:
①a[mid]>a[left]。说明中点必定位于较高的那一部分,如上述的[5,5,6,7,7,9],此时的中点必定也不是最小值点,如果要缩小区间那么必定是left=mid+1;但是这里需要注意一点的是,a[left]也有可能就是最小值,不过这前提还必须是a[left]<a[right];
②a[mid]<a[right]。说明中点必定位于较低的那一部分&#