问题:

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

 

思路:

1.思考可能的输入:

  (1)正常的递增数组:形如 1 , 2 , 3 ,4

  (2)全是相等数字的数组:形如 2 ,2 , 2 ,2

  (3)存在相等数字的数组:形如 1 , 2 , 2 ,2

2.因为旋转而导致最终数组表现为两个递增数组的堆叠,答案就在下一个数组的起始位置,因为数字的排列有一定的规律性所以可以采用二分法来进行求解

接下来我们用个例子来说明一下:
图片说明

代码:

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int[] array) {   
        if (array.length == 0){
              return 0;  
        }
        int i = 0, j = array.length - 1;
        while (i < j) {
            if (array[i] < array[j]) {
                return array[i];  //如果数组首尾递增,那么说明数组没有移动,直接返回第一个数字即可
            }
            int mid = (i + j) >> 1;
            if (array[mid] > array[i]) {
                i = mid + 1;
            } else if (array[mid] < array[j]) {
                j = mid; // 如果是mid-1,则可能会错过最小值,错例形如(5,6,3,4,4),减一可能会直接导致查找范围错误
            } else i++;  // 巧妙避免了坑点(2 1 2 2 2)
        }
        return array[i];
    }
}    

 

posted on 2021-02-28 12:09  墨庸愁冥  阅读(52)  评论(0编辑  收藏  举报