153. 寻找旋转排序数组中的最小值
假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
。
请找出其中最小的元素。
示例 1:
输入:nums = [3,4,5,1,2]
输出:1
示例 2:
输入:nums = [4,5,6,7,0,1,2]
输出:0
示例 3:
输入:nums = [1]
输出:1
提示:
1 <= nums.length <= 5000
-5000 <= nums[i] <= 5000
nums
中的所有整数都是 唯一 的nums
原来是一个升序排序的数组,但在预先未知的某个点上进行了旋转
思路:
旋转后的数组可画出如下的示意图,橙色线表示的就是旋转后数组的左右两个部分。不难发现,如果下标落在右半部分,则一定有nums[mid] <= nums[nums.length -1]
。
判断nums[mid] <= nums[nums.length -1]
是否成立
- 成立说明当前的
mid
落在了旋转数组的右半部分,而我们要找的最小值其实就是右半部分的开头,故更新区间为[l,mid]
- 否则说明
mid
落在了旋转数组的左半部分,那么右半部分的起点则在[mid + 1,r]
中
总结,寻找满足nums[mid] <= nums[nums.length -1]
的最小值
Java代码
class Solution {
public int findMin(int[] nums) {
//数组只有一个元素,或者数组本身就有序,即并未旋转,直接返回nums[0]即可
if(nums.length == 1 || nums[0] < nums[nums.length - 1]) return nums[0];
int l = 0,r = nums.length - 1;
while(l < r){
int mid = l + r >> 1;
if(nums[mid] <= nums[nums.length - 1]) r = mid;
else l = mid + 1;
}
return nums[l];
}
}