剑指Offer 11

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

解题思路:

旋转之后形成两个排序子数组,并且最小的元素是两子数组的分界线。可以用二分查找的方式去查找。

我们可以用两个指针来指向数组的第一个元素和最后一个元素。接着我们可以找到数组中间的数,如果数组位于前面的递增数组中,我们可以将第一个指针指向中间的元素,从而缩小搜索范围。如果数组位于后面的递增数组中,我们可以将第二个数组指向中间元素,缩小搜索范围。接下来用更新的指针重复做新一轮的查找。

特殊情况:1)输入数组长度为零   2)两指针和中间的数组相等时,只能顺序查找

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
       if (array == null || array.length == 0){
           return 0;
       }
        
        int start = 0;
        int end = array.length - 1;
        int index = 0;
        while (array[start] >= array[end]){
            if (end - start <= 1){
                return array[end];
            }
            int middle = (start + end) / 2;
            if (array[middle] == array[start] && array[middle] == array[end]){
                return findOrder(array, start, end);
            }
            if (array[middle] >= array[start]){
                start = middle;
                index = start;
            }
            if (array[middle] <= array[end]){
                end = middle;
            }
        }
        return array[index];
    }
    public int findOrder(int array[], int start, int end){
        int min = array[start];
        for (int i = 0; i <= end; i++){
            if (array[i] < min){
                min = array[i];
            }
        }
        return min;
    }
}

 

posted @ 2020-04-13 23:24  lucy_cui  阅读(94)  评论(0)    收藏  举报