153、寻找旋转排序数组中的最小值
题目:
解答:
原数组为升序,旋转的意思是将最后一个数移动到第一个数之前,进行n次。也就是旋转后的nums数组为两个升序数组(不是旋转n=nums长度次的话)寻找原来的第一个数,也就是整个数组的最小值
二分查找,红蓝染色
left=0,right=n-2,mid将数组划分为两个区间[0,mid][mid,n-1],这两个区间一定有一个是单调递增的,另一个是增减增,在最大值与最小值处出现下降。
对nums[mid]与nums[n-1]进行比较,小于则说明[mid,n-1]递增,那么最小值在[0,mid]中。不断更新mid,检查[mid,n-1]的单调性,小于说明单调,大于说明不单调,最小值在其中。
class Solution {
public:int findMin(vector<int>& nums) {int n = nums.size();int left=0,right=n-2;//nums[n-1]用于比较while(left<=right){int mid = left+(right-left)/2;//[left,mid]红if(nums[mid]>nums[n-1]){left=mid+1;}//[mid,n-1]蓝else{right=mid-1;}}return nums[left];}
};
时间复杂度O(logn)
空间复杂度O(1)
如果需要查找最大值,可以与nums[0]比较,也可以最小值下标-1。同样的,本题也应当可以与nums[0]进行比较获得