- 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
- 思路:暴力解法就是遍历了,但是这样没有用到它是旋转数组这个特性。
旋转数组应该是以最小元素为分界线,左边是一个非递减数组,右边也是一个非递减数组。
- 若array[0]<array[array.length-1]的,则这个数组是一个没有经过旋转的非递减数组,array[0]即为答案;
- 否则设置三个索引low,high,middle。low始终在左边的非递减数组,high始终在右边的非递减数组。
- 若array[low]=array[high]=array[middle],则无法确定最小元素的区间,此时需要遍历数组才能得到答案;
- 若array[low]<=array[middle],则最小元素在middle右侧,调整low=middle;否则最小元素在middle左侧,调整high=middle;
- 循环的结束条件应该是low+1=high。
- 具体实现时,middle初始化为low,可以直接判定该数组是否经过旋转。代码如下:
public int minNumberInRotateArray(int [] array) {
if(array.length==0||array==null) {
return 0;
}
int low = 0;
int high = array.length-1;
int middle = low;
while(array[low]>=array[high]) {
if(high-low==1) {
middle = high;
break;
}
middle = (low+high)/2;
if(array[low]==array[high]&&array[low]==array[middle]) {
//顺序查找
return find(array,low,high);
}
if(array[middle]>=array[low]) {
low = middle;
} else {
high = middle;
}
}
return array[middle];
}
public int find(int[] array , int low , int high) {
int min = array[low];
for(int i=low+1 ; i<=high ; i++) {
if(min>array[i]) {
min = array[i];
}
}
return min;
}