1、题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
2、思路:旋转数组找最小,其实就是将原来的递增数组查找变了个型。还是要紧紧抓住数组有序的特点,依然借鉴二分查找的方式来进行,二分查找可以用迭代或者循环均可实现。
(1)对比中间元素和头尾元素的大小,
若中间元素>头元素,则说明中间元素位于递增部分,那么最小元素一定位于后半部分。将头指针移向中间元素;
若中间元素<头元素,则说明中间元素位于递减部分,那么最小元素一定位于前半部分。将尾指针移向中间元素;
迭代的终止条件,指针指向两个相邻元素,第二个元素就是最小元素。
此时,还需要考虑两个特例:
第一个特例:旋转数组实际上没发生旋转,把0个元素挪到了后面。这时候的判定条件就是头元素小于最后一个元素,头元素就是最小元素。其实这种方式
第二个特例:中间元素=头元素,如:01111 旋转数组11101、10111,这时候就不知道到底该取哪半部分了。所以只能用遍历的方式取最小值。
3、代码://TODO利用书上思想实现一个。
public class Solution { public int minNumberInRotateArray(int [] array) { int low = 0 ; int high = array.length - 1; while(low < high){ int mid = low + (high - low) / 2; if(array[mid] > array[high]){ low = mid + 1; }else if(array[mid] < array[high]){ high = mid; }else{ //当中间数、第一个指针数、第二指针数,三个数相等的时候,用顺序查找 high = high - 1; } } return array[low]; } }