树状数组。
模板题,每次查询小于instructions[i]的元素或者大于等于instructions[i]的复杂度是logn级别,将instructions[i]插入到数组中也是logn级别。
class Solution {
public:
int mod=1e9+7;
int tr[100010];
int n=100005;
int lowbit(int x){
return x&-x;
}
void add(int u,int k){
for(int i=u;i<=n;i+=lowbit(i)) tr[i]+=k;
}
int query(int u){
int res=0;
for(int i=u;i;i-=lowbit(i)) res+=tr[i];
return res;
}
int createSortedArray(vector<int>& instructions) {
int ans=0;
for(auto c:instructions){
ans=(ans+min(query(c-1),query(n)-query(c))%mod+mod)%mod;
add(c,1);
}
return ans;
}
};
时间复杂度:O(nlogn)。
空间复杂度:O(n)。