【剑指offer】11.旋转数组的最小数字
题目:Find Minimum in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).Find the minimum element.
You may assume no duplicate exists in the array.
分析:
旋转数组有以下几个特点:
1.旋转过的数组,低位一定大于高位
2.旋转过的数组,以某个点为分界点,左右两边都是排好序的。通过二分法,从中间切一刀,一半是有序的,另一半是无序的。
3.最小的那个值一定在无序那一边,因为是最小的那个值导致数组的无序。
以旋转1 2 3 4 5为例,有以下4中旋转方法,(供参考理解)
2 3 4 5 1
3 4 5 1 2
4 5 1
2 3
5 1 2
3 4
思路:
利用二分法,如果中间位置比高位小,意味着中间到高位都是比中间大的。相反的,中间位置比高位大,说明原最小值的位置被旋转到中间位置与高位之间。
代码:
public int findMin(int[] arr)
{
int low = 0;
int high = arr.length - 1;
int mid = 0;
if(arr[low] < arr[high])
return arr[low];
if(arr.length == 0 || arr == null)
return 0;
while(arr[low] > arr[high])
{//说明无序
mid = (low + high) / 2;
if(arr[mid] > arr[high])
low = mid + 1; //!!!难点,考虑为什么+1?不加1有什么后果,能用别的方法避免吗?
else
high = mid;
}
return arr[low];
}