题目链接
寻找旋转排序数组中的最小值
题目描述
注意点
- 1 <= n <= 5000
- -5000 <= nums[i] <= 5000
- nums中的所有整数 互不相同
- nums原来是一个升序排序的数组,并进行了 1 至 n 次旋转
- 找出并返回数组中的最小元素
- 设计一个时间复杂度为 O(log n) 的算法解决此问题
解答思路
- 根据题意,数组可以视作两个升序数组组成(未旋转或旋转n次只有一个升序数组),且其中一个数组的最小值比另一个数组的最大值更大,根据该规律,可以用二分查找进行查询:如果当前数组左侧left比右侧right的值更小,说明该数组已经是一个升序数组,最小值就是最左侧的值;否则需要找到中间mid的值与left和right的值进行比较,如果比left大,说明最小值在右侧,否则说明最小值在左侧
代码
class Solution {public int findMin(int[] nums) {int res = -1;int n = nums.length;int left = 0;int right = n - 1;while (left <= right) {if (nums[left] < nums[right]) {return nums[left];}int mid = left + (right - left) / 2;if (nums[mid] < nums[left]) {right = mid;} else {left = mid + 1;}}return nums[right];}
}
关键点
- 旋转排序数组的规律
- 二分查找的思想