题目:有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
//暴力法import java.util.ArrayList;public class Solution {    public int minNumberInRotateArray(int [] array) {        int i3=-1;        for (int i=0;ii2){                i3=i2;                break;            }        }        if(i3==-1){            i3=array[0];        }        return i3;    }}
二分查找解析:1、初始化:分别声明i,j为array数组的左右两端;2、循环二分:设 m=(i+j)/2("/"为除法的向下取整),当 array[m] > array[j] 时: m 一定在左排序数组中,即旋转点 x 一定在 [m + 1, j] 闭区间内,因此执行 i = m + 1;3、当 array[m] < array[j] 时: m 一定在右排序数组中,即旋转点 x 一定在[i, m]闭区间内,因此执行 j = m4、当 array[m] = array[j] 时: 无法判断 mm 在哪个排序数组中,即无法判断旋转点 x 在 [i, m] 还是 [m + 1, j] 区间中。解决方案: 执行 j = j - 1 缩小判断范围5、返回值: 当 i = j 时跳出二分循环,并返回 旋转点的值 array[i] 即可。
//实际题目想要考察的是:二分查询import java.util.ArrayList;public class Solution {    public int minNumberInRotateArray(int [] array) {        if(array.length==0){            return 0;        }        //最左边指针        int i=0;        //最右边指针        int j=array.length-1;        //循环        while(iarray[j]){                   i=m+1;               }            //m在右排序数组中,旋转点在[i,m]中           else if(array[m]