题干:
给你一个元素值 互不相同 的数组
nums
,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
示例:
输入:nums = [3,4,5,1,2] 输出:1 解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。
public class 寻找旋转排序数组中的最小值 {
public static void main(String[] args) {
int[] nums = {3,4,5,1,2};
System.out.println(findMin(nums));
}
public static int findMin(int[] nums) {
int i=0,j=nums.length-1;
while (i<j){
int mid = i+(j-i)/2;
if(nums[mid]<=nums[j])
j=mid;
else
i=mid+1;
}
return nums[i];
}
}
通过比较nums[mid]和nums[j]的大小关系来收缩边界。如果nums[mid]>nums[j],说明至少[i,mid]这个区间是有序的,那么最小值就出现在[mid+1,j]这个区间内,所以让右指针i收缩到mid+1;如果nums[mid]<=nums[j],说明至少[mid,j]这个区间是有序的,最小值出现在[i,mid]这个区间内(现在不能排除nums[mid]不是最小值,所以包含mid),所以让左指针j收缩到mid。