当前位置: 首页 > news >正文

【算法-哈希表3】四数相加2 和 赎金信

今天,带来哈希表相关算法的讲解。文中不足错漏之处望请斧正!

理论基础点这里


1. 四数相加2

分析题意

求符合条件的四元组的出现次数,条件:

  • nums1
  • nums2
  • nums3
  • nums4
    从四个数组中的每一个数组取一个数 num1, num2, num3, num4,满足 num1 + num2 + num3 + num4 == 0,则这是一个满足条件的四元组,可以记上它的出现次数。

题意转化

可以简单转化为 直接遍历取得4个数, 判断是否满足条件.但太慢,时间复杂度O(n^4)。

其实可以动动脑筋,将题意转化为 是否存在 两个两数之和 sum1 和 sum2 相加为0。

解决思路

四个数组该怎样去遍历,建立映射?

我们可以先遍历前两个数组,将数组中的元素两两求和得到sum1,把sum1和其出现次数建立映射得到哈希表sums1。接着遍历后两个数组,也两两求和得到sum2,在sums1中O(1)查找是否有一个和,和当前sum相加为0。

但为什么要这样遍历,我先遍历一个建立映射,再遍历三个不行吗?

这样我们在最终搜索比对的时候需要3层for来玩儿,那就是O(n^3)。而我们两两遍历只需要O(2 * n^2),这才是更好的。

编程实现

class Solution {
public:// 四数之和的判断 拆分为 两数之和的判断// 先遍历两个数组并求得所有两数之和sums1, 再遍历两个数组求剩下的两数之和, 查找是否有sum1 = -sum2int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int, int> sums1; // <sum1, cnt> -- 题目不要求返回下标, 只用返回次数int sum1 = 0;int sum2 = 0;// 先遍历两个数组并求得所有两数之和sums1for (int &num1 : nums1) {for (int &num2 : nums2) {sum1 = num1 + num2;++sums1[sum1];}}// 再遍历两个数组求剩下的两数之和, 查找是否有sum1 = -sum2int cnt = 0;for (int &num3 : nums3) {for (int &num4 : nums4) {sum2 = num3 + num4;auto iter = sums1.find(-sum2);if (iter != sums1.end()) cnt += iter->second;}}return cnt;}
};

时间复杂度:O(n^2)

2. 赎金信

分析题意

“给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。”

题意转化

判断ransomNote的组成字符是否全部都在magazine中有足够的字符与之对应。

解决思路

查找,上哈希。遍历magazine,用哈希表描述magazine中的字符出现过多少次。

编程实现

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int appeared[26] = {0};// 用哈希表(数组)描述magazine中的哪些字符出现过.for (char &ch : magazine) ++appeared[ch - 'a'];// 在magazine中查找ransomNote的所有字符, 所有都能找到才是赎金信.for (char &ch : ransomNote) {--appeared[ch - 'a'];if (appeared[ch - 'a'] < 0) return false; // magazine中没有足够字符构成ransomNote}return true;}
};

时间复杂度:O(n)

空间复杂度:O(1)


今天的分享就到这里了,感谢您能看到这里。

这里是培根的blog,期待与你共同进步!

http://www.lryc.cn/news/235316.html

相关文章:

  • wpf devexpress自定义编辑器
  • 文档向量化工具(一):Apache Tika介绍
  • 学习c#的第二十一天
  • Michael Jordan最新报告:去中心化机器学习中的契约、不确定性和激励
  • 3ds Max渲染用专业显卡还是游戏显卡?
  • airlearning-ue4安装的踩坑记录
  • uniapp优化h5项目-摇树优化,gzip压缩和删除console.log
  • Pycharm之配置python虚拟环境
  • 如何使用MybatisPlus进行数据分页显示
  • 代码随想录 Day49 单调栈01 LeetCode LeetCodeT739每日温度 T496 下一个最大元素I
  • 高可用--限流熔断降级
  • win10电脑无法联网,设置IPv4,点击属性无法打开,闪退
  • 【数据结构】邻接表与邻接矩阵的转换
  • VR智慧景区:VR赋能文旅产业,激活消费潜能
  • Spring Boot EasyPOI 使用指定模板导出Excel
  • postgresql:记录表膨胀引起的io问题的处理
  • Windows下安装RabbitMQ
  • 广州华锐互动VRAR:利用VR开展刑事案件公安取证培训,沉浸式体验提升实战能力
  • 消息消费过程
  • 使用Lychee搭建个人图片存储系统并进行远程访问设置实现公网访问本地私人图床
  • 12-2- DCGAN -简单网络-卷积网络
  • Redis持久化策略之RDB与AOF
  • Python学习笔记--初识 Python 正则表达式
  • webAPP基础学习
  • RIP路由信息协议
  • kubernetes 高可用集群
  • java实现插入排序
  • 深度学习之基于YoloV5血红细胞检测识别系统
  • 8、可视化高斯滤波器并完成高斯滤波
  • Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式