Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?Would this affect the run-time complexity? How and why?
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Find the minimum element.
The array may contain duplicates.
有序的旋转数组前半部分和后半部分都是递增的序列。数组第一个元素要大于等于最后一个元素。否则数组本身就是个递增的序列,第一个元素就是最小数
如果不是递增序列,则取中间数。
1.如果中间数大于数组的第一个元素,说明最小数存在后半段,范围缩小到中间数到最后一个元素左开右闭区间
2.如果中间数小于数组的第一个元素,说明最小数存在前半段,范围缩小到第一个元素和中间数闭区间左开右闭区间。
3.如果中间数等于数组第一个元素,需要特殊处理。
3.1 如果中间数大于数组最后一个元素,说明最小数存在后半段, 范围缩小到中间数到最后一个元素左开右闭区间
3.2 如果中间数等于数组最后一个元素,则需分别找出这第一个元素到中间数,和中间数到最后一个元素这两个区间的最小数,然后对这两个最小数进行比较,最后取最小值。
class Solution {
public:
int min(vector<int>& nums,int index1,int index2)
{
int result=nums[index1];
for(int i=index1+1;i<=index2;i++)
{
if(result>nums[i])
result=nums[i];
}
return result;
}
int findMin(vector<int>& nums) {
int size=nums.size();
int left=0;
int right=size-1;
int mid=0;
while(nums[left]>=nums[right])
{
if(right-left==1)
{
mid=right;
break;
}
mid=(right+left)/2;
if(nums[left]==nums[mid]&&nums[mid]==nums[right])
return min(nums,left,right);
if(nums[mid]>=nums[left])
left=mid;
else if(nums[mid]<=nums[right])
right=mid;
}
return nums[mid];
}
};