欢迎访问LeetCode题解合集
题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [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[n - 1] > nums[0]
,说明没有旋转,直接返回nums[0]
即可 - 否则说明在某一点进行了旋转,根据
nums[mid]
与nums[n - 1]
的大小进行判断 - 若
nums[mid] > nums[n - 1]
,说明mid
在左边一段,需要往右边移动,l = mid + 1
- 否则的话,说明
mid
在右边一段,需要往左移动,r = mid
时间复杂度:$O(logn)$
额外空间复杂度:$O(1)$
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size();
if ( !n ) return 0;
if ( n < 2 ) return nums[0];
if ( nums[n - 1] > nums[0] ) return nums[0];
int l = 0, r = n - 1, m;
while ( l < r ) {
m = (l + r) >> 1;
if ( nums[m] > nums[n - 1] ) l = m + 1;
else r = m;
}
return nums[r];
}
};
/*
时间:4ms,击败:85.65%
内存:9.8MB,击败:83.85%
*/