使用map存储所有元素的出现次数,对于每一个元素k以及其出现次数v,考虑X-k的元素出现次数为y,将其相乘v *y即是对应的i和j的对数,将全部对应的k累加即可,由于i和j没有固定大小,所以最后不需要除以2。
Java
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int x = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextInt();
}
Map<Integer, Integer> mapp = new HashMap<>();
for (int num : a) {
mapp.put(num, mapp.getOrDefault(num, 0) + 1);
}
int ans = 0;
for (Map.Entry<Integer, Integer> entry : mapp.entrySet()) {
int k = entry.getKey();
int v = entry.getValue();
ans += mapp.getOrDefault(x - k, 0) * v;
}
System.out.println(ans);
}
}
C++
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
int n, x;
cin >> n >> x;
vector<int> a(n);
unordered_map<int, int> mapp;
for (int i = 0; i < n; i++) {
cin >> a[i];
mapp[a[i]]++;
}
int ans = 0;
for (const auto& pair : mapp) {
int k = pair.first;
int v = pair.second;
ans += mapp[x - k] * v;
}
cout << ans << endl;
return 0;
}
Python
from collections import Counter
n, x = map(int, input().split())
a = list(map(int, input().split()))
mapp = Counter(a)
ans = 0
for k, v in mapp.items():
ans += mapp.get(x - k, 0) * v
print(ans)
会员可通过查看《已通过》的提交记录来查看其他语言哦~
给定长度为N的序列a和非负整数X。小红喜欢满足ai+aj=X的(i,j)对,请求出满足这样条件的(i,j)对数量。
第一行给出一个序列长度N和一个非负整数 X,用空格分隔。
在第二行中,给出了序列a的N个元素,用空格分隔。 1<=N<=105,1<=X<=109,1<=ai<=105
输出一个整数表示最多可以找到多少个满足要求的数对
输入
3 4
1 2 3
输出
3