算法做業:第二章上機實驗報告

算法做業:第二章上機實驗報告

題目:

設a[0:n-1]是已排好序的數組,請改寫二分搜索算法,使得當x不在數組中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜索元素在數組中時,i和j相同,均爲x在數組中的位置。c++

輸入格式:

第一行是n值和x值; 第二行是n個不相同的整數組成的非降序序列,每一個整數之間以空格分隔。算法

輸出格式:

輸出小於x的最大元素的最大下標i和大於x的最小元素的最小下標j。當搜索元素在數組中時,i和j相同。 提示:若x小於所有數值,則輸出:-1 0 若x大於所有數值,則輸出:n-1的值 n的值數組

題解分析:

可直接利用二分搜索尋找目標數。只須要在搜索結束後判斷目標狀況便可。spa

複雜度分析:

本題使用了O(\(log_{2}n\))二分搜索算法再加上了最後的O(1)判斷,因此總複雜度仍是O(\(log_{2}n\))。code

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int main()
{
    #ifdef TEST
        freopen("input.txt","r",stdin);
    #endif
    int T,n,m,i,j,k;
    scanf("%d",&n);
    scanf("%d",&k);
    for(i=0;i<n;i++)scanf("%d",&a[i]);
    int l=0,r=n-1,mid,cnt=0;
    while(l<r)
    {
        mid=(l+r)>>1;
//      cout<<"-----"<<mid<<" "<<a[mid]<<endl;
        if(a[mid]>=k) r=mid;
        else l=mid+1; 
    }
    if(a[l]==k) cout<<l<<" "<<l<<endl;
    else if(l==0) cout<<"-1 0"<<endl;
    else if(l==n-1) cout<<n-1<<" "<<n<<endl;
    else cout<<l-1<<" "<<l<<endl;
}
相關文章
相關標籤/搜索