题目描述:
现有一个有序数组,假设从某个数开始将它后面的数按顺序放到了数组前面。
(即 [0,1,2,4,5,6,7] 可能变成 [4,5,6,7,0,1,2])。
请找出数组中的最小元素。
数组中不包含重复元素。
样例1
输入:[3,4,5,1,2]
输出:1
样例2
输入:[4,5,6,7,0,1,2]
输出:0**
借y大佬图一用
此时分两种情况,一种如上图,函数非单调,nums[i]最小时,i左侧函数值大于等于nums[0],右侧小于nums[0];可以以此为条件进行二分,时间复杂度logn;
另一种是单调递增;
方法一:
class Solution{
public:
int findMin(vector<int>& nums)
{
if(nums.back()>nums[0]) return nums[0];//判断单调递增的情况
int l=0,r=nums.size()-1;
while(l<r)
{
int mid=l+r>>1;
if(nums[mid]<nums[0]) r=mid;//从右向左逼近,始终在最小值及其右侧
else l=mid+1;//从左向右逐1累加,最终到达最小值
}
return nums[l];
}
};//方法二://过程同方法一,特别注意数组只有一个元素时,此法二分返回的nums[1]不存在,故提前排除此类情况
class Solution{
public:
int findMin(vector<int>& nums)
{
int l=0,r=nums.size()-1;
if(nums.back()>nums[0]||r==0) return nums[0];//排除数组长度为1
while(l<r)
{
int mid=l+r+1>>1;
if(nums[mid]>=nums[0]) l=mid;//从左向右,始终在最小值的左侧
else r=mid-1;//逐步减1,最终停在最小值的左侧
}
return nums[l+1];//l+1才是最小值
}
};
德华,可以舔一下话筒嘛