C++ 算法:计算数对个数 (a-b=c)
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main() {
int n, c;
cin >> n >> c;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
unordered_map<int, int> count;
int ans = 0;
for (int i = 0; i < n; i++) {
ans += count[nums[i] - c];
count[nums[i]]++;
}
cout << ans << endl;
return 0;
}
问题描述:
给出一串数以及一个数字 c,要求计算出所有 a-b=c 的数对的个数(不同位置得到数字一样的数对算不同的数对)。
输入:
共两行。第一行两个整数 n,c 。
第二行 a1,a2,a4... 个整数 ( ),作为要处理的那串数。
输出:
该数串中包含的满足a-b=c 的数对的个数
样例输入:
6 3 8 4 5 7 7 4
样例输出:
5
代码解释:
- 使用
unordered_map来存储每个数字出现的次数。 - 遍历数字序列,对于每个数字
nums[i],查找nums[i] - c的出现次数,并将其加到计数器ans中。 - 同时,将
nums[i]的出现次数加 1。 - 最后输出
ans的值。
代码分析:
代码利用了哈希表(unordered_map)的特性,可以高效地查找数字出现的次数。对于每个数字 nums[i],我们需要查找是否存在另一个数字 nums[j],满足 nums[j] - nums[i] = c。通过哈希表,我们可以快速地找到 nums[i] - c 的出现次数,从而计算出满足条件的数对个数。
优化建议:
- 如果数字序列中存在负数,需要在使用哈希表之前将所有数字加上一个足够大的常数,避免出现负索引。
- 如果数字序列中的数字范围较小,可以使用数组来存储每个数字出现的次数,这样效率会更高。
总结:
本文介绍了使用 C++ 语言解决一个算法问题:计算数对个数 (a-b=c),并提供了完整的代码实现和解释。希望这篇文章能帮助你更好地理解算法问题和 C++ 语言的使用。
原文地址: https://www.cveoy.top/t/topic/igLc 著作权归作者所有。请勿转载和采集!