直接上题意了:给定N个数字的组成的递增串,现在使其向做或者向左或者向右旋转K位。问:找到数组中最小数的是多少?
方案一:
由于原串是递增串通过旋转得到的。故想都不用想就可以得到如下第一种解决方案
int Find(int n)
{
for (int i = 0; i < n; i++)
{
if (a[(i + n - 1) % n] > a[i])
{
return i;//找到前一个大于当前的元素,就可以确定我们所需要得到值的下标
}
}
return 0;
}
上一种方案是很容易想到的,但是如果N很大时就得不偿失了。我们仔细阅读题目,可以知道,原串是递增的,通过旋转得到。因此,我们可以使用 二分。使用二分的过程中,我们会使用到left,right,mid,因此我们可以分为3种情况讨论。
1.当前位置mid就是最小的位置,直接返回mid;
2.a[mid] > a[right],则是right = mid + 1;
3.当前两种都不满足时,left = mid - 1.
稍微说明下:由于,原串升序,向左移动K位,那么后K位怎么都不会大于前面的数字。否则就违背了递增串了。当然K < N。
int search(int left, int right, int n)//n为元素个数
{
int mid = 0;
while (left < right)
{
mid = (left + right) / 2;
if (a[mid] < a[(mid - 1 + n) % n ])//找到最小的位置
{
return mid;
}
else if (a[mid] > a[right])//判断在右边块
{
left = mid + 1;
}
else right = mid - 1;//左边块
}
return left;
}
至此,暂时想到两种解决方案,欢迎补充新想法。