0 题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
1 分析
首先需要找到旋转数组的开始位置。
该数组可以分为两部分,两部分都是已经排序的了。
如果使用二分,那么当arr[start]>arr[end]那么就应该在这个缺件,因为,原始数组是递增的,因此,应该是arr[start]<arr[end]。
当相同的情况时,就只能从头开始遍历了。
2 实现
直接遍历实现,没有那么多的操作
int minNumberInRotateArray(vector<int> arr)
{
int len = arr.size();
if (len == 0)
{
return 0;
}
for (int i = 0; i < len - 1; ++i)
{
if (arr[i] > arr[i + 1])
{
return arr[i + 1];
}
}
}
通过二分确定:
int minNumberInRotateArray(vector<int> arr)
{
int len = arr.size();
if (len == 0)
{
return 0;
}
int end = len - 1;
int start = 0;
int mid;
// 开始的时候赋值为 arr[start] ,避免进不了while循环,
// 也就是数组并没有旋转过。返回值为空的情况
int ret = arr[start];
// 当等于的时候,使用 if 中的循环直接退化为遍历
while (arr[start] >= arr[end])
{
if (end - start == 1) // 当差距只有1的时候,那么返回end。
{
ret = arr[end];
break;
}
mid = (start + end) / 2; //二分
//判断相等的时候,也就是说例如 10111这种情况
if (arr[mid] == arr[start] && arr[mid] == arr[end])
{
for (int i = start; i < end; ++i)
{
if (arr[i] > arr[i + 1])
{
ret = arr[i + 1];
break;
}
}
}
if (arr[start] < arr[mid])
{
start = mid;
}
else
{
end = mid;
}
}
return ret;
}