部分有序數組中利用二叉查找尋找最大值

對於部分有序數組,想要尋找最大值,最簡單的方法是遍歷,時間複雜度爲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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章