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