当前位置:首页 > 洛谷 > 洛谷P1102题解:利用哈希表优化的数对统计 C++代码解析

洛谷P1102题解:利用哈希表优化的数对统计 C++代码解析

1天前

洛谷P1102题解:利用哈希表优化的数对统计 C++代码解析 洛谷题解 哈希表优化 数对统计 哈希表 数组 第1张

一、题目解读

洛谷P1102题要求处理一组整数数组与常数C,统计数组中是否存在元素A与B满足A+B=C。用户需输出满足条件的数对数量。题目关键在于快速判断是否存在互补元素,时间复杂度需优化以避免暴力遍历。

二、解题思路

采用哈希表(unordered_map)实现高效统计。首先遍历数组,记录每个元素的出现次数;再遍历数组计算每个元素的“目标值”(即C-当前元素),通过哈希表直接查询目标值是否存在及其频率,从而快速累加有效数对。此思路将时间复杂度从O(n²)降至O(n),利用空间换时间策略。

三、解题步骤

1. 输入数组长度n与常数C,初始化哈希表countMap。

2. 遍历数组,记录每个元素nums[i]的出现次数至countMap。

3. 第二次遍历数组,对每个nums[i]计算目标值target = nums[i] + C。

4. 若target存在于countMap中,累加其次数至结果res(注意:若A=B需避免重复计数)。

5. 输出最终数对数量res。

四、代码与注释

#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;

const int MAXN = 2e5 + 5;  // 定义最大数组长度
long long nums[MAXN];

int main() {
    int n;  // 数组长度
    long long c;  // 常数C
    cin >> n >> c;
    
    unordered_map<long long, int> countMap;  // 哈希表,记录元素频次
    for(int i = 0; i < n; i++) {
        cin >> nums[i];
        countMap[nums[i]]++;  // 统计每个数字出现次数
    }
    
    long long res = 0;  // 结果计数器
    for(int i = 0; i < n; i++) {
        long long target = nums[i] + c;  // 计算需要的B值(A+B=C)
        res += countMap[target];  // 累加满足条件的数对数量
    }
    
    cout << res << endl;
    return 0;
}

五、总结

该解法巧妙利用哈希表的快速查询特性,将数对统计转化为单次遍历与频次累加。核心在于预处理元素频率,避免重复计算。适用于数据量大但元素范围有限的场景,为同类问题提供高效模板。注意实际应用中需评估哈希表空间开销与冲突风险。



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

题意解析:给定一组数字,每当你选择一个数字x时,所有等于x-1和x+1的数字都会被自动移除。你需要通过巧妙的选择顺序,最大化获得的点数总和。这个问题可以转化为对离散化数字分布的动态规划问题——将相邻数...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

2023年GESP四级小杨的字典(洛谷B3927)解题报告:基于哈希表的字符串替换优化

2023年GESP四级小杨的字典(洛谷B3927)解题报告:基于哈希表的字符串替换优化

一、题目解读题目要求实现一个“字典替换”功能:给定一个字典(键值对映射)和一段文本,将文本中出现的字典中的单词替换为其对应的值,未匹配的单词用“UNK”代替。需处理标点符号分隔单词,并确保输入异常情况...

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

一、题目解读洛谷2652题要求对一组扑克牌进行排序,目标是找到最少需要调整的次数,使得所有牌形成同花顺。题目中,扑克牌由花色和数字组成,需先按花色排序,再在同花色内按数字排序。核心难点在于如何处理花色...

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

一、题目解读洛谷P1121题要求求解环形数组的最大子段和,即在一个环形数组中找到一个连续子段,使其元素和最大。环形数组的特殊性在于首尾元素可相连,需考虑线性子段与跨越首尾的环形子段两种情况。二、解题思...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。