题目来源:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
大致题意:
给一个旋转后的升序数组,找出最小元素
- 注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]]
思路
题目要求时间复杂度为 O( l o g n log_n logn)
那么需要用二分来查找数组的最小值
二分
- 初始时,设置左边界 l = 0 和右边界 r = n - 1,n 为数组长度
- 每次取中间元素与当前右边界数比较
- 若中间数大于右边界数,表示当前中间位置的数旋转后索引变小,也就是说最小值应该在右侧,去掉左侧一半数字,更新左边界的值为当前的中间位置 + 1;若小于,则表示当前中间位置属于旋转之前的前半部分,即表明最小值在中间位置左侧,去掉右侧一半数字,更新右边界的值为当前的中间位置
代码:
class Solution {
public int findMin(int[] nums) {
int n = nums.length;
int l = 0;
int r = n - 1;
while (l < r) {
int mid = (l + r) / 2;
// 去掉左侧一半
if (nums[mid] > nums[r]) {
l = mid + 1;
} else { // 去掉右侧一半
r = mid;
}
}
return nums[l];
}
}