题目描述
假设一个按照升序排列的有序数组从某个未知的位置旋转。
(比如 0 1 2 4 5 6 7 可能变成 4 5 6 7 0 1 2)。
找到其中最小的元素。
你可以假设数组中不存在重复的元素。
解题思路
如果这个升序排序的有序数组确实按照某个未知的位置旋转,只有两种可能:
1.a [mid] > a [left] && a [mid]> a [right],所以,mid位于较大的那部分,较小的部分位于mid右边,应该向右走;
2.a [mid] <a [left] && a [mid] <a [right],所以,mid位于较小的那部分,为了找到最小的元素,应该向左走;
如果这个数组没有旋转(或者是循环旋转完),只需要往左走,a[mid]总是< a[right];
结论:mid > right,向右走;mid < right,向左走;
public int findMin(int[] nums) {
if (nums==null || nums.length==0) {
return Integer.MIN_VALUE;
}
int left = 0, right = nums.length-1;
while (left < right-1) {
int mid = left + (right-left)/2;
if (nums[mid] > nums[right]) { left = mid; }
else { right = mid; }
}
if (nums[left] > nums[right]) {
return nums[right];
}
return nums[left];
}
//更推荐这个答案
public int findMin(int[] nums) {
int left = 0,
right = nums.length - 1,
mid = 0;
while(left < right){
mid = (left + right) >> 1;
if(nums[mid] > nums[right]) left = mid + 1;
else right = mid;
}
return nums[right];
}