C++算法练习-day16——454.四数相加2

题目来源:. - 力扣(LeetCode)

题目思路分析

题目要求我们在四个整数数组 nums1, nums2, nums3, nums4 中找出所有满足 (a + b + c + d) == 0 的元组 (a, b, c, d) 的数量,其中 a 属于 nums1b 属于 nums2c 属于 nums3d 属于 nums4。这是一个典型的四数之和为零的问题,可以通过不同的算法方法来解决。本题采用的思路是利用哈希表(unordered_map)来优化查找过程,使得时间复杂度从 O(n2)。

思路实现步骤

  1. 构建哈希表 :首先,遍历 nums1nums2,计算它们所有可能的和,并将这些和作为键存储在哈希表中,同时记录每个和出现的次数。
  2. 查找满足条件的元组 :然后,遍历 nums3nums4,计算它们的和的相反数(即 -r-e),检查这个相反数是否存在于哈希表中。如果存在,则说明可以找到一个 ab(来自 nums1nums2),使得 a + b + c + d = 0 成立。因此,将哈希表中对应的和的次数累加到结果中。

代码:

复制代码
#include <vector>  
#include <unordered_map>  
  
class Solution {  
public:  
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {  
        // 创建一个哈希表来存储nums1和nums2所有可能的和及其出现次数  
        unordered_map<int,int> res;  
          
        // 遍历nums1和nums2,计算它们的和,并更新哈希表  
        for(int e : nums1){  
            for(int r : nums2){  
                ++res[r+e]; // 使用e和r的和作为键,出现次数加1  
            }  
        }  
          
        int ans = 0;  
          
        // 遍历nums3和nums4,查找满足条件的元组  
        for(int e : nums3){  
            for(int r : nums4){  
                // 检查-r-e是否在哈希表中,如果在,说明存在对应的a和b使得和为0  
                if(res.count(-r-e)){  
                    ans += res[-r-e]; // 将对应和的次数累加到结果中  
                }  
            }  
        }  
          
        return ans; // 返回满足条件的元组数量  
    }  
};

知识点摘要

  1. 哈希表(unordered_map) :在C++中,unordered_map 提供了一种高效存储键值对的方式,可以实现快速的查找、插入和删除操作。其内部通常使用哈希函数来实现键值对的存储。
  2. 嵌套循环:在解决一些数组相关的问题时,嵌套循环是一种常见的技巧,用于遍历数组的所有元素或所有可能的元素组合。
  3. 时间复杂度优化:通过使用哈希表,我们可以将查找操作的时间复杂度从 O(n) 降低到 O(1)(平均情况下),从而大幅优化整个算法的时间复杂度。

通过这道题目,我们学习到了如何使用哈希表来优化数组组合问题的时间复杂度。特别是在处理四个数组之和为零的问题时,通过将问题分解为两个部分(计算两个数组的和并存储在哈希表中,然后在另外两个数组中查找对应的和的相反数),我们可以将原本复杂度较高的问题简化为较为高效的解决方案。这种方法不仅适用于本题,还可以推广到类似的组合和问题中,是一个值得学习和掌握的技巧。

相关推荐
264玫瑰资源库28 分钟前
问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
java·开发语言·前端·游戏
普if加的帕1 小时前
java Springboot使用扣子Coze实现实时音频对话智能客服
java·开发语言·人工智能·spring boot·实时音视频·智能客服
2301_807611491 小时前
77. 组合
c++·算法·leetcode·深度优先·回溯
安冬的码畜日常2 小时前
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
开发语言·前端·人工智能·ai·扫雷游戏·ai辅助编程·辅助编程
朝阳5812 小时前
Rust项目GPG签名配置指南
开发语言·后端·rust
微网兔子2 小时前
伺服器用什么语言开发呢?做什么用什么?
服务器·c++·后端·游戏
朝阳5812 小时前
Rust实现高性能目录扫描工具ll的技术解析
开发语言·后端·rust
程高兴2 小时前
基于Matlab的车牌识别系统
开发语言·matlab
YuforiaCode2 小时前
第十三届蓝桥杯 2022 C/C++组 修剪灌木
c语言·c++·蓝桥杯
YOULANSHENGMENG2 小时前
linux 下python 调用c++的动态库的方法
c++·python