旋转数组的最小数字
1.题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。
示例 1:
示例 2:
2.思路(二分搜索)
1.如果数组只有一个元素,直接返回nums[begin]。
2.如果nums[end] > nums[begin],说明数组是有序递增的,直接返回nums[begin]。
3.如果mid = begin + (begin + end) / 2到达数组的边界:
(1)nums[mid] > nums[mid + 1],则返回nums[mid + 1]。
(2)num[mid - 1] > nums[mid],则返回nums[mid]。
4.二分搜索:
(1)如果nums[mid] > nums[begin],说明nums[mid]在前面的递增数组中,最小值应该在后面,因此begin = mid + 1。
(2)如果nums[mid] < nums[end],说明nums[mid]在后面的递增数组中,最小值应该在前面,因此end = mid - 1。
3.代码
class Solution {
public:
int findMin(vector<int>& nums) {
//如果数组只有一个元素
if(nums.size() == 1){
return nums[0];
}
int begin = 0;
int end = nums.size() - 1;
//如果数组是有序的,返回第一个
if(nums[end] > nums[begin]){
return nums[0];
}
//二分搜索
while(begin <= end){
int mid = begin + (end - begin) / 2;
//如果mid到达边界,mid是最小值的前一个值
if(nums[mid] > nums[mid + 1]){
return nums[mid+1];
}
//如果mid到达边界,mid是最小值
if(nums[mid] < nums[mid - 1]){
return nums[mid];
}
if(nums[mid] > nums[begin]){
begin = mid + 1;
}
else if(nums[mid] < nums[end]){
end = mid - 1;
}
}
return -1;
}
};
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
来源:CSDN
作者:overlordmax
链接:https://blog.csdn.net/jiangdongxiaobawang/article/details/103936202