现在的位置: 首页 > 综合 > 正文

旋转数组的最小元素

2013年09月04日 ⁄ 综合 ⁄ 共 784字 ⁄ 字号 评论关闭

  题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
  解题:类似二分查找,使用两个指针:left ,right 指向一前一后,一般情况下arr[left]一定大于等于arr[right],除非排序好的数组本身没动过
  再使用mid=(left+right)/2 这样,如果 arr[mid]如果>=arr[left]说明在最小值在mid之后,否则在mid之前(包含mid本身)。更新left ,right,继续查找,直到left == right
so the code is as follows:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int findMinOfRotateArray(int arr[],int len)
{
	int left=0,right=len-1,mid=left;
	assert(arr != NULL && len >0);
	if(len==1) return arr[0]; //make sure left > right
	while(arr[left] >= arr[right])
	{
		mid=(left+right)>>1;
		if(arr[mid]>=arr[left])
		{
			left=mid+1;
		}
		else
		{
			right=mid;
		}
		if(left == right)
		{
			break;
		}
	}
	return arr[left];

}
int main(void) {
	int arr[]={1,1,2,3,4,5,6,6,-1,0,0,1};
	printf("find it:%d\n",findMinOfRotateArray(arr,sizeof(arr)/sizeof(int)));
	return 0;
}

抱歉!评论已关闭.