面试题11:求旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组末尾,即数组的旋转;

例如:{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,输出该数组的最小值1

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//顺序查找最小值
int Order(int *numbers,int index1,int index2)
{
	int result=numbers[index1];
	for(int i=index1+1;i<=index2;++i)
	{
			if(result>numbers[i])
			{
				result=numbers[i];
			}		
	}
	return result;
}

int Min(int *numbers,int length)
{
	if(numbers==nullptr||length<=0)  //判断若数组为空,或长度若小于0,则不合法
	{
		printf("error");
	}

	int index1=0;         //初始化index1为0号下标,即第一个数组
	int index2=length-1;  //初始化index2为最后一个数组的下标
	int indexMid=index1;   //
	while(numbers[index1]>=numbers[index2])
	{
		if(index2-index1==1)
		{
			indexMid=index2;
			break;
		}
		indexMid=(index1+index2)/2; //让indexMid 指向数组中间的值

		//若下标index1 index2 indexMid 的值都相等 则只能顺序寻找
		if(numbers[index1]==numbers[index2]&&numbers[indexMid]==numbers[index1])
		{
			return Order(numbers,index1,index2);
		}
		//若中间值位于前面的递增数组,则在后面一半找最小值
		if(numbers[indexMid]>=numbers[index1])
			index1=indexMid;
		//若中间值位于后面的递增数组,则在前面一半找最小值
		else if(numbers[indexMid]<=numbers[index2])
			index2=indexMid;
	}
	return numbers[indexMid];
}



int main()
{
	int numbers1[5]={2,3,4,67,1};
	int numbers2[5]={1,4,5,6,7};
	int numbers3[5]={1,2,3,2,1};
	printf("%d\n",Min(numbers1,5));
	printf("%d\n",Min(numbers1,5));
	printf("%d\n",Min(numbers1,5));
	return 0;
}

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41431406/article/details/84146492
今日推荐