如何降低此代码的复杂性

How to reduce complexity of this code

本文关键字:复杂性 代码 何降低      更新时间:2023-10-16

请任何人提供更好的算法,然后尝试此问题的所有组合。

给定一个包含 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.