如何降低此代码的复杂性
How to reduce complexity of this code
请任何人提供更好的算法,然后尝试此问题的所有组合。
给定一个包含 N 个数字的数组 A,找到不同对的数量 (i, j( 使得 j>=i 和 A[i] = A[j]。
输入的第一行包含测试用例 T 的数量。每次测试 案例有两行,第一行是数字N,后跟一行 由 N 个整数组成,这些整数是数组 A 的元素。
对于每个测试用例,打印不同对的数量。
约束: 1 <= T <= 10
1 <= N <= 10^6
-10^6 <= A[i] <= 10^6 表示 0 <= i
我认为首先对数组进行排序,然后找到每个不同整数的频率,然后添加所有频率的 nC2 加上最后添加字符串的长度。但不幸的是,对于某些未知帮助的情况,它给出了错误的答案。这是实现。
code:
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long fun(long a) //to find the aC2 for given a
{
if (a == 1) return 0;
return (a * (a - 1)) / 2;
}
int main()
{
long t, i, j, n, tmp = 0;
long long count;
long ar[1000000];
cin >> t;
while (t--)
{
cin >> n;
for (i = 0; i < n; i++)
{
cin >> ar[i];
}
count = 0;
sort(ar, ar + n);
for (i = 0; i < n - 1; i++)
{
if (ar[i] == ar[i + 1])
{
tmp++;
}
else
{
count += fun(tmp + 1);
tmp = 0;
}
}
if (tmp != 0)
{
count += fun(tmp + 1);
}
cout << count + n << "n";
}
return 0;
}
计算每个数字在数组中出现的次数。然后遍历结果数组并为每个数组添加三角形数字。
例如(来自源测试用例(:
Input:
3
1 2 1
count array = {0, 2, 1} // no zeroes, two ones, one two
pairs = triangle(0) + triangle(2) + triangle(1)
pairs = 0 + 3 + 1
pairs = 4
三角形数可以用(n * n + n) / 2
来计算,整个事情是O(n(。
编辑:
首先,如果您正在计算频率,则无需排序。我知道你在排序方面做了什么,但如果你只保留一个单独的频率数组,那就更容易了。它需要更多的空间,但由于元素和数组长度都被限制为< 10^6
,你需要的最大值是一个int[10^6]
。这很容易满足挑战中给出的 256MB 空间要求。(哎呀,由于元素可能会变为负数,因此您需要一个两倍于该大小的数组。
对于n choose 2
部分,你错的部分是这是一个n+1 choose 2
问题。由于您可以单独配对每个,因此您必须添加一个 n
.我知道你在最后添加了n
,但这不一样。tri(n)
和tri(n+1)
之间的区别不是一个,而是n
.
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 为什么此代码O(n)的时间复杂性
- 找到最大的主要因素 - 代码的复杂性
- 用宏替换重复"if"块是否会降低C++中的代码复杂性?
- 以下代码的复杂性是什么?
- 将几行代码写成一行是有益的(就内存和空间复杂性而言)。值得吗?
- 此代码的运行时复杂性是多少
- 以下代码片段的算法复杂性
- 如何降低此代码的复杂性
- 该代码的复杂性是什么
- 代码的复杂性
- 如何在Visual Studio 2008中确定c++代码的复杂性(如CPU周期)
- 多态性:代码中的复杂性错误.需要一个解释
- 下面代码的复杂性是多少
- 我如何直观地证明这段代码的时间复杂性
- 此代码的复杂性是什么?我们是否应该总结复杂性