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

题目的意思很清楚,就是在一个可以翻转的数组中找寻到我们的最小数字。一眼就可以想到是二分法,但是怎么个二分呢。刚开始分析了1 2 3 4 5的所有情况,但是发现这些情况没办法一一判断,而且如果出现00010的情况,二分法也没办法去分,题目说的是非递减,递增的大小可以为0。这个时候只能挨个遍历获取。挨个遍历之后呢,此时使用二分,只要大于后面就往后移动,可以知道小的在后面,只要大于前面就往前移动,记住往小的一遍挪即可。

代码

public int minNumberInRotateArray(int[] array) {
        if (array == null) return 0;

        int l = 0;
        int r = array.length - 1;
        while (l <= r) {
            int m = l + (r - l) / 2; // 找出中点
            // 如果大于前,也大于后
            if (array[m] == array[l] && array[m] == array[r]) {
                // 只能采用遍历取最小
                int min = Integer.MAX_VALUE;
                for (int num : array) {
                    min = Math.min(min,num);
                }
                return min;
            }
            // 否则采用二分法判断向前还是向后
            if (array[m] > array[r]) {
                l = m + 1;// 向后
            } else {
                r = m; // 向前
            }
        }
        return 0;
    }

很久之前写的题目了,今天再写可能是脑子里面还是有之前的印象吧,总想与它对着来,但是最后还是没能逃脱,终究还是那样了。

Keep thinking, keep coding!