题目:有一个长度为 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]