**题目描述
现有一个有序数组,假设从某个数开始将它后面的数按顺序放到了数组前面。
(即 [0,1,2,4,5,6,7] 可能变成 [4,5,6,7,0,1,2])。
请找出数组中的最小元素。
数组中可能包含重复元素。
样例1
输入:[1,3,5]
输出:1
样例2
输入:[2,2,2,0,1]
输出:0
**
借y大佬图一用哈
如上图,此题要进行二分,就必须把右侧与nums[0]相等一段去掉,去掉之后再判断数组是否单调
class Solution//方法一
{
public:
int findMin(vector<int> &nums)
{
int l=0,r=nums.size()-1;
while(nums[l]==nums[r]&&l<r) r--;//l<r防止元素相等时数组被清空
if(nums[r]>nums[0]) return nums[0];//判断单调递增
while(l<r)
{
int mid=l+r>>1;
if(nums[mid]<nums[0]) r=mid;
else l=mid+1;
}
return nums[l];
}
};
class Solution//方法二
{
public:
int findMin(vector<int> &nums)
{
int l=0,r=nums.size()-1;
while(nums[l]==nums[r]&&l<r) r--;
if(nums[r]>nums[0]||r==0) return nums[0];//r==0时排除数组大小为1时,以便二分能进行
while(l<r)
{
int mid=l+r+1>>1;
if(nums[mid]>=nums[0]) l=mid;
else r=mid-1;
}
return nums[l+1];
}
};
加油!期待更好的分享!
大佬过奖了
喜欢有图文解释的博客.