本题要求在旋转排序数组中寻找最小值。例如:
输入:nums = [3,4,5,1,2] 输出:1
解题思路:通过比较二分值x与数组末尾元素nums.back()来判断x的位置:
- 若x <= nums.back(),说明x位于第二段递增序列,此时x可能是最小值或在最小值右侧
- 若x > nums.back(),说明x位于第一段递增序列,x必定在最小值左侧
通过不断二分缩小范围,最终循环结束时指向的元素即为最小值,返回其下标即可。
cpp
class Solution {
public:
int findMin(vector<int>& nums) {
int left = -1,right = nums.size() - 1;
while (left + 1 < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < nums.back()) {
right = mid;
}else{
left = mid;
}
}
return nums[right];
}
};
时间复杂度:O(logn)
空间复杂度:O(1)