Find Minimum in Rotated Sorted Array
Description
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.
Notice
You may assume no duplicate exists in the array.
实现思路
这道题用二分法求解。
要找到最小的,根据旋转特性,关键在于找“最大”的下一个,比如12345,旋转成45123,显然1在5的后边。
再观察,我们发现,最大的元素,必定比最右边的元素大。
所以每次可以取中间元素,然后和最后一个比:
1. 如果小于最后一个,说明属于从前面折到后面的,则最小必定在前面,当然也有可能它本身就是最小,故left = mid
2. 而如果大于最后一个,则最大的还在后边,可以取right = mid + 1
不断重复1、2,直到left = right,终止循环,则left必为我们要找的最小元素
/**
* @param nums: a rotated sorted array
* @return: the minimum number in the array
*/
public int findMin(int[] nums) {
// write your code here
int len = nums.length;
if(len == 1){
return nums[0];
}
int left = 0,right = len-1;
int min = nums[0];
while(left < right){
int mid = (right - left) / 2 + left;
if(nums[mid] > nums[right]){
left = mid + 1;
}else{
right = mid;
}
}
return nums[left];
}