面试题--数组旋转续

来源:互联网 发布:软件的特点是什么 编辑:程序博客网 时间:2024/05/26 16:00

直接上题意了:给定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;}
至此,暂时想到两种解决方案,欢迎补充新想法。


0 0