题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
注意数组中可能存在重复的元素。
样例
blablabla
算法分析
二分
再搬一下y总的图hh
- 1、为了保证左边的值永远大于右边的值,因此当
nums[r] == nums[0]
时,把nums[r]
的值删掉,直到满足要求为止,当0 == r
时,则0
的位置就是最小值,直接返回,否则进行2
操作 - 2、可以知道排列数组旋转后在最小值点的两边都是单调递增的,且左边的每个值都比右边的值大,在给定的区间
[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 && nums[r] == nums[0]) r --;
if(l == r) return nums[0];
while(l < r)
{
int mid = l + r >> 1;
if(nums[r] >= nums[mid]) r = mid;
else l = mid + 1;
}
return nums[l];
}
}