查找数组中的不平衡点
Find Dis-balanced point in array
给定一个数组。对于每个元素,我们必须计算两个值 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 数组中。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 我的神经网络不起作用 [XOR 问题]
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- OpenMP 和不平衡嵌套循环
- OpenMP C++:并行化 for 循环的负载不平衡
- 可以提示插入到标准::地图导致不平衡的树
- 删除字符串中不平衡的括号
- 为什么我的递归快速排序算法有如此不平衡的分区
- 查找数组中的不平衡点
- 使用 .Net 4.0 时出现堆栈不平衡错误,但在使用 .Net 2.0 时不调用堆栈不平衡错误
- 为什么是我的AVL树删除功能不平衡
- 试图捕获不平衡的分隔符.我需要显示与之关联的行号.遇到问题和我的测试文件
- 正在打印不平衡的二进制树
- 在 g++ 中使用 __attribute__ 的不平衡括号
- 为什么我在opencv 3.0测试版中找不到平衡白色
- 由于指针导致堆栈不平衡
- C++map.esers()会导致不必要的平衡
- 不平衡随机数生成器
- AVL树从来没有不均衡的平衡C++
- 是否有可能从未排序的数组中高效地创建平衡二叉搜索树而不对数组进行排序?