c++ - 在大小为 n 的数组中查找索引 i<j ,以便这些索引处的值之和等于 i + j

标签 c++ arrays algorithm sorting

我的解决方案:

#include <bits/stdc++.h>

int main() {
    int n;//Size of array
    std::cin>>n;
    std::vector<long long>vec_int;
    int temp = n;
    while(n--){
        long long k ;
        std::cin>>k;
        vec_int.push_back(k);
    }
    n = temp;
    int num = 0;
    for(int  i = 0 ; i < n-1 ; i++){
        for(int j = i+1; j<n; j++){
            if(i<j && i+j == vec_int[i]+vec_int[j])
                num++;
        }
    }

    std::cout<<num;

    return 0;
}

我正在扫描大约需要 O(n^2) 时间的数组。在非常大的阵列上,问题的时间限制超过 2 秒的持续时间。我尝试对数组进行排序,但没有走得太远。我怎样才能加快速度?是否有可能在 O(n) 时间复杂度内做到这一点。

最佳答案

考虑重新定义您的问题。表达式:

i+j == vec_int[i]+vec_int[j]

在代数上等价于:

vec_int[i] - i == -(vec_int[j] - j)

所以定义:

a[i] = vec_int[i] - i

现在的问题是计算 a[i] == -a[j] 的次数。

这可以在 O(n) 中进行测试。使用 unordered_map m 计算每个负值在 a 中出现的次数。然后对于每个正值 a[i] 将与 m[-a[i]] 负值配对。还要计算 a 中零的数量并计算它们之间的对数。

关于c++ - 在大小为 n 的数组中查找索引 i<j ,以便这些索引处的值之和等于 i + j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53360319/

相关文章:

java - 处理二维数组排序的任务

java - java中将十进制转换为格雷码

python - 我的 0-1 Knapsack DP 解决方案有什么问题?

c++ - 抽象类c++的对象作为函数的参数

c++ - 您如何通过构造函数初始化所有对象?

c++ - 通过模板实现接口(interface)

javascript - 检查对象键是否为空数组或检查它是否具有自己的属性

java - 数组索引越界错误

algorithm - Python 中的邻接集表示

c++ - 可变参数模板的可变参数初始化