旋转数组的最小值
方法1:采用顺序遍历的方法,最优的时间复杂度为O(1),最差的时间复杂度为O(n),
方法2,采用二分查找法,时间复杂度为O(logn);该方法在左神算法里也出现过
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
/*
(1)判断数组为空的情况下
(1)判断数组有序的情况下,返回数组的第一个元素
(3)当数组中只有两个元素的时候,返回最小值
(4)否则当数组中的元素个数大于2的时候,将arr[left]和arr[right]和arr[mid]相比
*/
int n=rotateArray.size();
if(n==0)return 0;
int left=0;
int right=n-1;
int res;
while(left<right)
{
int mid=left+(right-left)/2;
//数组有序的情况下
if(rotateArray[left]<rotateArray[right])
return rotateArray[left];
//子序列中只有两个元素的情况
if(left+1==right)return rotateArray[left]<rotateArray[right]?rotateArray[left]:rotateArray[right];
//判断最小值在左子序列还是右子序列
if(rotateArray[left]>rotateArray[mid])
right=mid;
else
if(rotateArray[mid]>rotateArray[right])
left=mid;
if(rotateArray[left]==rotateArray[right]==rotateArray[mid])
{
res=rotateArray[left];
for(int i=left;i<=right;i++)
{
if(rotateArray[i]<res)
res=rotateArray[i];
}
break;
}
}
return res;
}
};