二分查找来查找旋转数组
Posted TheQi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找来查找旋转数组相关的知识,希望对你有一定的参考价值。
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
二分查找代码
class Solution
{ public:
int minNumberInRotateArray(vector<int> rotateArray)
{
int len = rotateArray.size();
if(len == 0) return 0;
int left = 0, right = len -1, mid = 0;
while(rotateArray[left] >= rotateArray[right])
{
//左是大数组的最后一个,右是小数组的第一个,返回右的值
if(right - left == 1)
{
mid = right;
break;
}
mid = (left + right)/2;
//如果左,右,中间的值相等,不知道中间在哪个数组中,需要用笨方法查找
if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid])
{
return shunxuOrder(rotateArray, left, right);
}
//如果中间的值小于右边的值,那么中间的值在小数组中,让右等于中间的值
//如果中间的值等于右边的值,此时中间的值一定小于左边的值才能走到这里,小于左边的值说明它在小数组里,让右等于中间的值
if(rotateArray[mid] <= rotateArray[right])
{
right = mid;
}
//如果中间的值大于右边的值,那么中间的值在大数组中,让左等于中间的值
else
{
left = mid;
}
}
return rotateArray[mid];
}
private: int shunxuOrder(vector<int> &num, int left, int right)
{
int i;
int result = num[left];
for(i = left + 1; i < right; ++ i)
{
if(num[i] < result)
{
result = num[i];
}
}
return result;
}
};
以上是关于二分查找来查找旋转数组的主要内容,如果未能解决你的问题,请参考以下文章