2021.4.8 寻找旋转排序数组中的最小值
题目描述
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
思路
一种解法是直接遍历,时间复杂度是O(n),但本题可以采用二分法,虽然数组进行了旋转,但是取中间坐标,左右两侧总会有一侧是有序的,只需要对有序的一边进行考虑就行。
如果是左边有序,那么左边的一串数字一定是旋转过来的,最小值一定在右边,如果右边有序,那么最小值可能就是mid或者在左边。
定义 i j两个指针来确定区间,mid = (i + j) / 2
例如4 5 6 7 0 1 2 第一次寻找 --> mid = (0 + 6) / 2 = 3 : nums[mid] = 7 --> 4 5 6 7有序,就把左指针移到mid + 1 即 0 的位置继续寻找
有这几种情况我们就可以代码找出最小值
代码
public static int findMin(int[] nums) {
if(nums == null) return -1;
int res = nums[0] , n = nums.length;
int l = 0, mid ,r = n - 1;
while(l <= r){
mid = (r + l) / 2;
if(nums[mid] <= nums[r]){
res = Math.min(res,nums[mid]);
r = mid - 1;
}else{
l = mid + 1;
}
}
return res;
}