剑指offeroffer中有这样一道题,把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
初看这道题没有思路,而且也没有想到用二分法,看了解析,明白了,可以和以前学的二分法结合起来。
二分法是数据需是有序不重复的。 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止。
本题也可以借鉴二分法的思想,中间的数和最右边的数比较,如果比最右边的数大,则最小的数在右半部分,如果比右边的数小,则最小的数在左半部分,但是如果相等呢?比如1,1,1,0,1这种情况,就需要一个一个的比较了。然后在次比较,直到相等。
public class Solution {
public int minNumberInRotateArray(int [] array) {
int low = 0 ; int high = array.length - 1;
while(low < high){
int mid = (high + low) / 2;
if(array[mid] > array[high]){
low = mid + 1;
}else if(array[mid] == array[high]){
high = high - 1;
}else{
high = mid;
}
}
return array[low];
}
}