二分法的时间复杂度是O(logn)
1. 法一:遍历全部数组找到最小值 O(n);
2. 法二:对数组进行排序,最小值就是nums[0];
3. 法二:二分查找法 :对于有序数组 类似单峰函数的数组
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0,right = nums.size()-1;
while(left<right){//保证左闭右开区间里始终套住目标值(最小值)
int mid = left + (right-left)/2;//mid更靠近left 因为找的是最小值
if(nums[mid] > nums[right]){
left = mid+1;
}else{
right = mid;
}
}
return nums[left];
}
};
如图:对于nums[right]:最小值左侧的数都大于nums[right],所以当nums[mid]>nums[right]时,最小值在mid的右侧;最小值右侧的数都小于nums[right],所以当nums[mid]<nums[right]时,最小值在mid的左侧。(左边界值nums[0]或右边界值nums[len-1]也可以与mid比较)
不能用nums[left]比较,链接里讲清楚了