我的解决方案:
#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)
时间复杂的情况下执行此操作。
答案 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
中的零数,并计算它们之间的对数。