算法作业:第二章上机实验报告

算法作业:第二章上机实验报告

题目:

设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

输入格式:

第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。

输出格式:

输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值

题解分析:

可直接利用二分搜索寻找目标数。只需要在搜索结束后判断目标情况即可。

复杂度分析:

本题使用了O(\(log_{2}n\))二分搜索算法再加上了最后的O(1)判断,所以总复杂度还是O(\(log_{2}n\))。

#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;
}

猜你喜欢

转载自www.cnblogs.com/na7-TRZNDP-Z/p/9824261.html