题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
请找出其中最小的元素。
你可以假设数组中不存在重复元素。
样例
输入: [3,4,5,1,2]
输出: 1
输入: [4,5,6,7,0,1,2]
输出: 0
算法分析
二分
搬一下y总的图hh
可以知道排列数组旋转后在最小值点的两边都是单调递增的,且左边的每个值都比右边的值大,在给定的区间[l,r]
中存在最小值点,可以发现若nums[r] - nums[mid] > 0
时,则最小值点一定在[l, mid]
中,否则在[mid + 1, r]
中
时间复杂度 $O(logn)$
Java 代码
class Solution {
public int findMin(int[] nums) {
int n = nums.length;
int l = 0, r = n - 1;
while(l < r)
{
int mid = l + r >> 1;
if(nums[r] > nums[mid] ) r = mid;
else l = mid + 1;
}
return nums[l];
}
}