题目描述:

思路分析:
本题可以借用二分查找的思路:设 x=nums[mid] 是现在二分取到的数。我们需要判断 x 和数组最小值的位置关系,谁在左边,谁在右边?把 x 与最后一个数 nums[n−1] 比大小:
如果 x>nums[n−1],那么可以推出以下结论:1.nums 一定被分成左右两个递增段;2.第一段的所有元素均大于第二段的所有元素;3.x 在第一段。4.最小值在第二段。5.所以 x 一定在最小值的左边。
如果 x≤nums[n−1],那么 x 一定在第二段。(或者 nums 就是递增数组,此时只有一段。)
x 要么是最小值,要么在最小值右边。
所以,只需要比较 x 和 nums[n−1] 的大小关系,就间接地知道了 x 和数组最小值的位置关系,从而不断地缩小数组最小值所在位置的范围,二分找到数组最小值。
代码:
java
class Solution {
public int findMin(int[] nums) {
int n=nums.length;
int right=n-1;
int left=0;
while(left<right){
int mid=(right-left)/2+left;
if(nums[mid]<nums[n-1]){
right=mid;
}else{
left=mid+1;
}
}
return nums[right];
}
}
代码分析:
终止条件为left<right,如果是<=则可能会一直走if(nums[mid]<nums[n-1])的情况导致死循环。
left=mid+1是因为如果mid在第一段,则最小值一定在left的右边。