對於部分有序數組,想要尋找最大值,最簡單的方法是遍歷,時間複雜度爲O(n),但我們可以由有序性想到利用二叉查找,比如:對於一個先升後降數組,尋找其中最大值
for example:
input:1 2 3 4 5 6 6 1
output:6
input: 1 2 3 4 5 6 7 8 9 6 4 3 2 1
output: 9
這是一道面試題,現在整理如下:
#include<iostream>
#include<vector>
using namespace std;
int findMax(vector<int> v,int start,int end)
{
int mid=0;
int count=0;
while(end-start>1)
{
count++;//用於記錄查找次數,測試時可以說明這個算法與遍歷相比效率明顯較高
cout<<"has searched "<<count<<"times"<<endl;
mid=start-(start-end)/2;//得到中點位置
if(v[mid]>v[mid-1]&&v[mid]>v[mid+1])
{//下標mid處值大於其左右值說明這個點爲最大值點
return v[mid];
}
else if(v[mid]>=v[mid-1]&&v[mid]<=v[mid+1])
{//下標mid處值大於等於左側,小於等於右側說明這點在“上升段”,也就是最大值偏向右側,因此需要將start向右移動,這樣mid才能更接近這個最大值,此處就將start移動到mid處
start=mid;
}
else if(v[mid]<=v[mid-1]&&v[mid]>=v[mid+1])
{//下標mid處值小於等於左側值,大於等於右側值說明這點在“下降側”,即最大值偏向右側,將end向左移動mid才能更接近這個最大值
end=mid;
}
}
return max(v[start],v[end]);//當start和end差值爲1時最大值就是二者之一
}
int func(vector<int> array)
{
int len=array.size();
cout<<findMax(array,0,len-1)<<endl;
}
int main()
{
vector<int> array;
int in;
int N=0;
cin>>N;
for(int i=0;i<N;i++)
{
cin>>in;
array.push_back(in);
}
func(array);
return 0;
}