查找数组中的不平衡点

Find Dis-balanced point in array

本文关键字:不平衡 平衡点 数组 查找      更新时间:2023-10-16

给定一个数组。对于每个元素,我们必须计算两个值 LL 和 RR。 LL=特定数组元素左侧的元素数小于它。 RR=特定数组元素右侧大于它的元素数 我们需要从数组中找到绝对值 (LL-RR) 的最大值。 在 o(n^2) 中求解,但想要 O(n) 或 O(nlogn) 方法。
输入: 1 5
1 2 1 3 4 输出: 4

#include<bits/stdc++.h>
using namespace std;

int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)cin>>a[i];
int ll=0;
int rr=0;
int mx=INT_MIN;
for(int i=0;i<n;i++)
{
ll=rr=0;
for(int j=i-1;j>=0;j--)
{
if(a[j]<a[i])ll++;
}
for(int k=i+1;k<n;k++)
{
if(a[k]>a[i])rr++;
}
int t=abs(ll-rr);
if(t>mx)mx=t;

}
cout<<mx<<endl;

}


}

首先摆脱:

#include<bits/stdc++.h>  // non standard
using namespace std; // will cause name collision in the future.

相反,请包含您需要的内容:

#include <iostream>

并使用std::前缀,例如:。

std::cout << mx << std::endl;

为了提高你的复杂性,想想你的目标是什么,以及你现在是如何实现这些目标的。

目前,您可以通过线性地遍历 a[i] 之前的所有元素来计算小于 a[i] 的元素。你需要一个可以在 O(log i) 而不是 O(i) 中回答这个问题的数据结构。

一种可能性是红黑树,用于计算每个子树中的节点数。

从左到右遍历数组。将每个元素插入 rb 树,更新每个 a[i] 的计数,这是 O(log i)。从插入的节点向上到根,每次从右侧到达时:对左侧的计数求和 + 1。这给出了 LL,并且对于每个 a[i] 在 O(log i) 中工作。

对于 RR,请执行相反的操作。 从右到左,并像以前一样做,但对否定值执行(这样可以很容易地重用相同的 rb-tree 代码)。将计数存储在 RR 数组中。