C++中求旋轉數組中的最小數字(經典面試題)。本站提示廣大學習愛好者:(C++中求旋轉數組中的最小數字(經典面試題))文章只能為提供參考,不一定能成為您想要的結果。以下是C++中求旋轉數組中的最小數字(經典面試題)正文
面試題:旋轉數組的最小數字
題目:把一個數組的最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個遞增數組的旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1.
算法:
(1)當輸入的旋轉數組非法時:處理!
(2)當輸入的旋轉數組正常時,index1 = 0;index2=length-1:
a:如果arry[index1] <arry[index2]時:說明數組為原數組,並沒有進行旋轉;
b:如果arry[index1] >= arry[index2]時,middle = (index1+index2)/2:
b.1如果arry[index1] >arry[middle],index2 = middle;
b.2如果arry[index1] <= arry[middle],index1 = middle;
b.3 如果arry[index1] = arry[middle] = arry[index2],遍歷找到最小值。
代碼:
Min_RotateArray.hpp
#pragma once
#include<iostream>
using namespace std;
int Min_RotateArray(int arry[],int size)
{
if(arry == NULL || size <= 0)
{cout<<"參數輸入錯誤!!!"<<endl;}
int min = 0;
int index1 = 0;
int index2 = size-1;
int middle = (index1+index2)/2;
if(arry[0] < arry[size-1])
return arry[0];
while(arry[index1] >= arry[index2])
{
if(index2-index1 == 1)
{
min=index2;
break;
}
middle = (index1+index2)/2;
if(arry[index1] <= arry[middle])//arry[middle]還在第一個遞增序列中
{
index1 = middle;
}
else
{
if(arry[index1] >= arry[middle])//arry[middle]在第二個遞增序列中
{index2 = middle;}
if(arry[index1] == arry[index2] && arry[index1] == arry[middle])
{
for(int i=0;i<size;++i)
{
if(arry[min]>arry[i])
{
min = i;
break;
}
}
}
}
}
return arry[min];
}
Min_RotateArray.cpp
#include"Min_RotateArray.hpp"
int main()
{
int arry[] = {3,4,5,1,2};
int size = sizeof(arry)/sizeof(arry[0]);
int min = Min_RotateArray(arry,size);
cout<<"The min is:"<<min<<endl;
system("pause");
return 0;
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!