1.暴力法
遍历求最小值
class Solution {
public:
int findMin(vector<int>& nums) {
int imin=nums[0];
for(int i=1;i<nums.size();i++)
imin=min(imin,nums[i]);
return imin;
}
};
2.二分法
主要考虑的是存在重复元素
旋转后整体元素有两种情况:
全部升序
一部分升序+一部分升序
由于存在重复元素,故这里的升序并不是严格升序
重点考虑的是nums[mid]==nums[right]是,此时最小值在左还是在右不确定,但是由于两者相等,故right指向的元素不再需要,故right--
如3 3 1 3
1 3 3 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;
if(nums[mid]<nums[right])
right=mid;
else if(nums[mid]>nums[right])
left=mid+1;
else if(nums[mid]==nums[right])
right--;//最小值可能在左,也可能在右,但right指向的元素不需要了,即使nums[right]是最小值,前面还有一个nums[mid]
}
return nums[right];
}
};