查找索引i <j in =“” an =“” array =“” of =“” size =“” n =“” so =“” that =“” the =“” sum =“” of =“”值=“” at =“” these =“” index =“” is =“” equal =“” to =“” i =“” + =“” j

时间:2018-11-18 11:26:07

标签: 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)时间的阵列。在非常大的阵列上,问题的时间限制超过了2s的持续时间。我尝试对数组进行排序,但距离不远。我怎样才能加快速度?是否可以在O(n)时间复杂的情况下执行此操作。

1 个答案:

答案 0 :(得分:6)

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

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中的零数,并计算它们之间的对数。