1. 程式人生 > >面試題11:求旋轉陣列的最小數字

面試題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;
}

執行結果:

在這裡插入圖片描述