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

贾蔷
• 阅读 3

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

一、题目解读

洛谷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;
}

五、总结

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

来源:洛谷题解

点赞
收藏
评论区
推荐文章
贾蔷 贾蔷
1个月前
2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略
一、题目解读2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所有字符出现的次数均相同。题目需要高效算法解决,考验对字符串处理和状态压缩的掌握。二、解题思路采用位运算
贾蔷 贾蔷
3星期前
牛客12576题全解析:动态规划+质因数分解解决跳跃问题
一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂度,避免暴力枚举的指数级耗时。二、解题思路采用“动态规划
贾蔷 贾蔷
3星期前
2023年GESP六级小杨握手问题(洛谷B3874):Fenwick树求解逆序对的代码解析
一、题目解读“小杨的握手问题”源自2023年GESP六级考试(对应洛谷题目B3874)。题目描述为:给定一个长度为N的排列,每次将当前数与之前未访问过的数握手,求总共握手次数。本质上是求排列中逆序对的个数,即统计每个数右侧比它小的元素数量。需设计高效算法在
深度学习 深度学习
3星期前
2024蓝桥杯省赛B组前缀总分(洛谷P12124)解题思路与代码详解
一、题目解读2024年蓝桥杯省B组题目“前缀总分”(对应洛谷P12124)要求计算给定字符串集合中,所有前缀的最长公共前缀(LCP)的总分,并找出通过移动字符位置后可能获得的最大总分。题目考察字符串处理与动态规划能力,需高效计算LCP并优化得分策略。二、解
贾蔷 贾蔷
3星期前
2023年GESP六级题解:洛谷P10108闯关游戏动态规划解法详解
一、题目解读本文针对2023年GESP六级题目“闯关游戏”(洛谷P10108)进行详细解析。题目要求玩家通过不同关卡路径选择,计算从起点到终点的最大得分。关卡间存在跳跃规则,需结合动态规划思想设计高效算法,最终输出最优得分。二、解题思路采用动态规划(Dyn
深度学习 深度学习
3星期前
洛谷P2034题解:动态规划+单调队列优化求解最大K段子段和问题
一、题目解读洛谷P2034题目要求给定一个长度为n的整数数组,将其分成不超过k段,求各段和的最大值。该问题属于经典动态规划问题的扩展,需结合优化技巧高效求解。二、解题思路采用动态规划单调队列优化的策略。核心思想是定义状态dp
深度学习 深度学习
1星期前
NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解
一、题目解读问题(,)要求使用给定数量的火柴棒,构造形如ABC的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式数量。题目核心在于将数字拆解与火柴棒消耗建模为数学问题,寻找高效解法。二、解题思路采用火柴棒计数策略:1.关系
贾蔷 贾蔷
1星期前
2024蓝桥杯省赛B组“传送阵”题解
一、题目解读2024年省B组“传送阵”题目要求处理一个包含n个节点的,节点间存在单向传输关系。每个节点i可传送至a中的最长路径问题,需考虑环的存在及节点间的连通性。二、解题思路1.预处理阶段使用标记法找出所有环,记录每个环的大小(即节点数)。2.统计最大环
贾蔷 贾蔷
1星期前
牛客13278题详解:句子单词反转(C++实现)
一、题目解读13278题要求编写函数实现句子中单词顺序的反转,例如将"HelloWorld"转换为"WorldHello"。需注意处理首尾空格、单词间空格数量保持原样,仅单词顺序颠倒。题目考察对操作的掌握,特别是分割与重组技巧。二、解题思路采用:1.预处理
深度学习 深度学习
3天前
2015年蓝桥杯国赛C组机器人繁殖题解析:高精度整数代码实现与解题思路
一、题目解读2015年C组“机器人繁殖”问题要求求解机器人按月繁殖的累计数量。题目设定初始机器人数量为a,每月新增b台,需计算n个月后总机器人数。由于繁殖数量可能呈指数级增长,普通整数类型无法存储结果,因此需采用高精度整数运算解决。二、解题思路核心在于自定