1. 程式人生 > >數組(二分查找)

數組(二分查找)

0ms AC 接下來 problem code %d sin others des

數組

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

給一個數組a[n],令s[i]為數組a中比a[i]大的數的個數。求數組s。

Input:

輸入包含多組測試數據,對於每組數據,輸入一個整數n(1<=n<=10^5),接下來有n個整數a[i](0<=a[i]<=10^9);保證輸入的a[i]全部不同。

Output:

對於每組數據,輸出數組s。

Sample Input:

5
3 4 5 1 2
10
11 4 12 5 3 8 10 6 7 9

Sample Output:

2 1 0 4 3
1 8 0 7 9 4 2 6 5 3
解題思路:簡單的二分查找,水過!upper_bound(b,b+n,a[i])-b返回的是大於a[i]的第一個元素的下標。二分查找的時間復雜度是O(log(n)),所以總的時間復雜度大約為O(nlog(n))。

AC代碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+5;
 4 int n,a[maxn],b[maxn],s[maxn];
 5 int main(){
 6     while(~scanf("%d",&n)){
 7         for(int i=0;i<n;++i){scanf("%d",&a[i]);b[i]=a[i];}
 8         sort(b,b+n);//先排序
 9         for(int i=0;i<n;++i)
10 s[i]=n-(upper_bound(b,b+n,a[i])-b);//二分查找 11 for(int i=0;i<n;++i) 12 printf("%d%c",s[i],i==n-1?\n: ); 13 } 14 return 0; 15 }

數組(二分查找)