[Lc]153寻找旋转排序数组中的最小值
Contents
题目
题解
这题与33题类似,33是查找,这一题是找最小值,也要利用旋转数组的性质
- 如果中间的数小于等于最右边的数,则右半段是有序的,最小值在左半段(包括中间值);
- 若中间数大于最右边数,则左半段是有序的,最小值在右半段
这时因为旋转之后最小值是一个分水岭,其所在位置是一个低谷。那么有序的那半段肯定没有低谷(除非低谷在中间,这个包含在情况一)
0 1 2 4 5 6 7
7 0 1 2 4 5 6
6 7 0 1 2 4 5
5 6 7 0 1 2 4
4 5 6 7 0 1 2
2 4 5 6 7 0 1
1 2 4 5 6 7 0
- 时间复杂度$O(logN)$
- 空间复杂度$O(1)$
class Solution {
public:
int findMin(vector<int>& nums) {//与#33类似,也是二分法
int left = 0,right = nums.size()-1;
while(left<right){//设置循环
int mid = left + (right-left)/2;//寻找中间值
if(nums[mid]<=nums[right]) right = mid;
//如果中间的数小于等于最右边的数,最小值在左半段(包括中间值);
else left = mid+1;
//如果中间的数小于等于最右边的数,最小值在右半段(不包括中间值);
}
return nums[right];//注意这里要返回右指针的,因为情况一包括了最小值在中间的情况,用右指针可以选到中间。
}
};
```cpp
Author ChrisHRZ
LastMod 2020-05-11