剑指offer__03__旋转数组的最小数字

题目

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

心得

小小题目大变化,边界测试少不得,处处留心得永生

代码

/**
特殊情况:0111111
        旋转为
        1101111
        这个时候下面的算法就不能使用,就需要使用顺序查找法
*/
import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if (array.length == 0)
            return 0;
        int start = 0, end = array.length - 1;
        int middle = start; // 这个用来处理不旋转的数组
        while (array[start] >= array[end]) {
            if (end == start + 1) {
                middle = end;
                break;
            }

            middle = (start + end) / 2;
            //这个用来处理上面提到的特殊案例
            if (array[start] == array[end] && array[end] == array[middle])
                return minInOrder(array, start, end);
            if (array[start] <= array[middle]) {
                start = middle;
            }
            else if (array[middle] <= array[end]) {
                end = middle;
            }
        }
        return array[middle];
    }
    public int minInOrder (int[] array, int start, int end) {
        int result = array[start];
        for (int i = start; i <= end; i++) {
            if (result > array[i])
                result = array[i];
        }
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/u013310517/article/details/79121530