第六天|454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

news/2026/1/20 20:36:40/文章来源:https://www.cnblogs.com/ounijiangovo/p/19508727

第六天|454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

454.四数相加II

第454题.四数相加II | 代码随想录

学透哈希表,map使用有技巧!LeetCode:454.四数相加II_哔哩哔哩_bilibili

笔记

通过单独遍历两个数组来提高时间效率

  1. 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
  2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
  3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
  4. 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  5. 最后返回统计值 count 就可以了

实操出现问题

为什么我的代码时间非常长?

代码/比较

我的代码:

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {//遍历前两个和后两个数组  1234int n=nums1.size();int sum12=0;//数组1 和 2 的元素和,放进map里面unordered_map<int,int> m_map;//map的key存放和,value存放出现次数for(int i=0;i<n;i++)//数组1和2,把他们的和放进一个map里面,map的key存放和,value存放出现次数{for(int j=0;j<n;j++){sum12=nums1[i]+nums2[j];if(m_map.find(sum12)!=m_map.end())//如果出现过,则value自增{m_map.find(sum12)->second++;}//如果没有出现过,则插入,value=1m_map.insert(pair<int,int> (sum12,1));}}int sum34=0;int count=0;//和为0的次数//遍历数组3和4,在map里面寻找和的相反数,找到了则加上value,没找到则下一个for(int i=0;i<n;i++){for(int j=0;j<n;j++){sum34=nums3[i]+nums4[j];if(m_map.find(0-sum34)!=m_map.end()){count+=m_map.find(0-sum34)->second;}}}return count;}
};

其他:

class Solution {
public:int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数// 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中for (int a : A) {for (int b : B) {umap[a + b]++;}}int count = 0; // 统计a+b+c+d = 0 出现的次数// 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。for (int c : C) {for (int d : D) {if (umap.find(0 - (c + d)) != umap.end()) {count += umap[0 - (c + d)];}}}return count;}
};

能通过key直接访问value,不用额外的使用find方法。

383. 赎金信

383. 赎金信 | 代码随想录

笔记:

自己的想法:

magazine里面的字符都统计一下个数存放到一个数据结构里,再遍历ransomnote,去那个数据结构里找,找得到就把个数自减,找不到返回false,并且时刻检测个数是否小于0,如果小于零返回false。

map实现,为什么?key存放magazine串中的字母,value存放个数。(注意:unorder_map.find()找的是keymapkey可以初始化为charlong等其他形式)

一遍过

代码随想录上的思路:

因为题目说只有小写字母,那可以采用空间换取时间的哈希策略,用一个长度为26的数组来记录magazine里字母出现的次数。

然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。

依然是数组在哈希法中的应用。

一些同学可能想,用数组干啥,都用map完事了,其实在本题的情况下,使用map的空间消耗要比数组大一些的,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了。 所以数组更加简单直接有效!

实操出现问题:

unorder_map.find()找的是keymapkey可以初始化为charlong等其他形式

代码:

我自己的:

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {unordered_map<char,int> magazine_map;//用于存放magazine//unordered_map<char,int> ransomNote_map;//ransomNotefor(int i=0;i<magazine.size();i++)//将magazine转化为map{magazine_map[magazine[i]]++;}//相减//怎么遍历一个map?不遍历map,而直接遍历string即可for(int i=0;i<ransomNote.size();i++){char n=ransomNote[i];if(magazine_map.find(n)!=magazine_map.end())//如果能找到则对应的value自减{magazine_map[n]--;if(magazine_map[n]<0)//如果小于零,则出现magazine内的字母不够的情况{return false;}}else//如果找不到,说明不能由magazine里面的字符构筑,返回false{return false;}}return true;}
};

代码随想录上的:

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int record[26] = {0};//addif (ransomNote.size() > magazine.size()) {return false;}for (int i = 0; i < magazine.length(); i++) {// 通过record数据记录 magazine里各个字符出现次数record[magazine[i]-'a'] ++;}for (int j = 0; j < ransomNote.length(); j++) {// 遍历ransomNote,在record里对应的字符个数做--操作record[ransomNote[j]-'a']--;// 如果小于零说明ransomNote里出现的字符,magazine没有if(record[ransomNote[j]-'a'] < 0) {return false;}}return true;}
};

15.三数之和

梦破碎的地方!| LeetCode:15.三数之和_哔哩哔哩_bilibili

第15题. 三数之和 | 代码随想录

笔记:

用双指针法:首先将数组从小到大排序,一个循环内,左指针指向i+1,右指针指向末尾,如果i+left+right>0,说明大了,这个数要减小只能right--,同理如果小于0,只能left++

去重细节:

i的去重:和前一个(已经遍历过的那个i)对比,如果相同,不再遍历,直接i++(即continue

leftright的去重:left如果和left+1相同,则往下遍历,不管当下的left;如果rightright-1相同,则往下遍历,不管当下的``right

去重的逻辑详细看文章第15题. 三数之和 | 代码随想录

实操出现的问题:

1.二维数组的插入:result.push_back(vector<int> {nums[i],nums[left],nums[right]});//把当前的结果放进result

2.什么时候去重leftright:应该再找到一个符合的结果后进行去重leftright,不然会导致漏掉遍历的。

代码:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;//结果数组int result_hangshu=0;//存放第几个结果sort(nums.begin(),nums.end());//从小到大排序if(nums[0]>0)return {};for(int i=0;i<nums.size();i++)//遍历整个数组{if(i>0&&nums[i]==nums[i-1])//对i去重continue;int left=i+1;int right=nums.size()-1;//指向末尾while(right>left)//left和right遍历{if((nums[right]+nums[left]+nums[i])>0)//结果大了,需要让这个和变小只能是right--right--;else if((nums[right]+nums[left]+nums[i])<0)//结果小了,需要让这个和变小只能是left++left++;else if((nums[right]+nums[left]+nums[i])==0)//找到目标值{result.push_back(vector<int> {nums[i],nums[left],nums[right]});//把当前的结果放进result//去重left和rightwhile(right>left&&nums[left]==nums[left+1])left++;while(right>left&&nums[right]==nums[right-1])right--;left++;right--;}}}return result;}
};

没有操作减枝!

9.四数之和

笔记:

和上面的题目类似,多加一层循环即可

实操出现的问题:

1.第二次循环没有注意nums[i]+nums[k]是一个整体

2.注意如果是较大的整型相加会溢出,用long来接收运算结果

代码:

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;sort(nums.begin(), nums.end());for (int k = 0; k < nums.size(); k++) {// 剪枝处理if (nums[k] > target && nums[k] >= 0) {break; // 这里使用break,统一通过最后的return返回}// 对nums[k]去重if (k > 0 && nums[k] == nums[k - 1]) {continue;}for (int i = k + 1; i < nums.size(); i++) {// 2级剪枝处理if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {break;}// 对nums[i]去重if (i > k + 1 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出if ((long) nums[k] + nums[i] + nums[left] + nums[right] > target) {right--;// nums[k] + nums[i] + nums[left] + nums[right] < target 会溢出} else if ((long) nums[k] + nums[i] + nums[left] + nums[right]  < target) {left++;} else {result.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});// 对nums[left]和nums[right]去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;// 找到答案时,双指针同时收缩right--;left++;}}}}return result;}
};

1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1190691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026年比较好的酶解海藻液,纯酶解海藻,高浓度酶解海藻厂家选购选型手册 - 品牌鉴赏师

引言在农业现代化进程中,酶解海藻液凭借其独特的优势,在提高农作物产量、改善农产品品质等方面发挥着重要作用。为了帮助广大用户在众多的酶解海藻厂家中做出更优选择,我们依据国内相关行业协会公开的数据以及权威白…

天然蛋白vs重组蛋白:核心差异、应用选择与质量控制全解析

天然蛋白与重组蛋白是现代生命科学研究与生物技术应用中的两大核心物质基础。它们虽然在最终功能上可能相似,但在来源、制备路径、分子特性及应用指向性上存在根本性差异。明确理解二者的区别,对于科研实验设计、数据…

1/17考试总结

前言 哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 T1 没考虑完所有情况。 没想到正解,括号匹配是复习了的。 时间安排不是很合理,调了1h15min。 多练练思维。 T2 我用记忆化补的,dp[i][j]表示当剩下的礼物区间是 [L,…

scATAC Transformer 输入的token是什么,句子是什么?

对于 scATAC-seq(单细胞染色质可及性测序)数据,将其输入 Transformer 模型时,其 Token 和 句子 的定义与 scRNA-seq(如 scBERT)既有相似之处,也有显著的生物学差异。 在 scATAC-seq Transformer 模型(如 scATA…

HBase在大数据领域金融数据处理中的应用

HBase在大数据领域金融数据处理中的应用 关键词&#xff1a;HBase、大数据、金融数据处理、分布式存储、实时读写 摘要&#xff1a;本文主要探讨了HBase在大数据领域金融数据处理中的应用。首先介绍了相关背景知识&#xff0c;包括HBase的基本概念、金融数据处理的特点和需求。…

本人入住博客园啦 原CSDN昵称大Mod_abfun是本人

本人入住博客园啦 原CSDN昵称大Mod_abfun是本人这是我的CSDN主页接下来的内容会将大部分的博客迁移过来,如有之前搬运的文章,不算做侵权,但后续(2026年1月20日 20点31分后)出现文章的搬运将追究责任,搬运需要经过…

2026年诚信的立式混料机,连续螺带混料机,混料机厂家行业优选榜单 - 品牌鉴赏师

引言在2026年的工业领域,立式混料机、连续螺带混料机的市场竞争愈发激烈,众多混料机厂家如雨后春笋般涌现。为了给行业内的从业者、采购商等提供一个客观、公正、权威的选择参考,我们依据国内权威行业协会公开数据形…

上海智推时代对接指南:官方认证联系方式汇总 - 速递信息

在生成式 AI 重塑商业生态的今天,“被 AI 看见、被 AI 推荐” 已经成为企业生存与发展的核心命题。曾经,企业通过线下渠道拓展、传统广告投放就能打开市场;而如今,消费者的信息获取方式发生了根本性转变 —— 从主…

动态SQL(七)sql标签

sql标签 可以将常用的sql片段进行记录 需要用的时候直接引入即可 设置sql片段引用sql片段测试

上海智推时代官方联系方式:企业合作必备指南 - 速递信息

在生成式 AI 重塑商业生态的今天,“被 AI 看见、被 AI 推荐” 已经成为企业生存与发展的核心命题。曾经,企业通过线下渠道拓展、传统广告投放就能打开市场;而如今,消费者的信息获取方式发生了根本性转变 —— 从主…

2026年口碑好的高纯度壳寡糖,壳寡糖水溶肥,酶解壳寡糖厂家采购推荐指南 - 品牌鉴赏师

引言在2026年,随着农业现代化进程的加速以及对高品质农产品需求的不断增长,高纯度壳寡糖、壳寡糖水溶肥和酶解壳寡糖作为新型生物刺激素,在农业领域的应用愈发广泛。为了帮助广大采购商能够挑选到口碑好、质量优的相…

MyBatis的一级缓存

什么是缓存&#xff1f; 把当前查询出来的数据进行记录&#xff0c;下一次查询相同数据时&#xff0c;从缓存中去取&#xff0c;就不会重新访问数据库了 MyBatis的缓存分为一级缓存和二级缓存 一级缓存默认是开启的 缓存只针对查询功能有效 CacheMapperCacheMapper.xml测试 pac…

twonkyserver 目录遍历 (CVE-2018-7171)

get请求构造payload:/rpc/dir?path=查看010

MBA必看!10个高效降aigc工具推荐,轻松应对AI检测

MBA必看&#xff01;10个高效降aigc工具推荐&#xff0c;轻松应对AI检测 AI降重工具&#xff1a;高效应对论文查重难题 在当前的学术环境中&#xff0c;随着AI技术的广泛应用&#xff0c;论文的AIGC率逐渐成为高校和研究机构关注的重点。对于MBA学生而言&#xff0c;如何在保证…

技术面:MySQL篇(InnoDB的锁机制)

共享锁、排他锁、意向锁、记录锁、间隙锁、临键锁(Next Key Lock)、插入意向锁、AUTO-INC、悲观锁、乐观锁MySQL的InnoDB的锁机制 MySQL的InnoDB引擎下,在锁的级别上一般分为两种:共享锁(S锁)、排他锁(X锁) 共…

使一级缓存失效的四种情况

一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession查询的数据会被缓存&#xff0c;下次查询相同的数据&#xff0c;就会从缓存中直接获取&#xff0c;不会从数据库重新访问 使一级缓存失效的四种清空: 不同的SqlSession对应不同的一级缓存同一个SqlSession但是查询条…

Linux环境编程第二天笔记

Linux环境编程第二天fork()fork()会使得进程本身被复制&#xff0c;父子进程几乎一模一样。被复制的实际的UID和GID&#xff0c;以及有效的UID和GID所有的环境变量进程组ID和会话ID当前的工作路径&#xff0c;除非用chdir()修改打开的文件信号响应函数整个内存空间、包括栈、堆…

Elasticsearch近实时搜索揭秘:1秒内可查如何实现?

当你在 Kibana 中查询刚生成的日志&#xff0c;或在电商网站搜索刚上架的商品时&#xff0c;可能会好奇&#xff1a;数据写入后不到 1 秒就能搜到&#xff0c;这是如何实现的&#xff1f; 这背后就是 Elasticsearch (ES) 的“近实时”&#xff08;Near Real-Time, NRT&#xff…

Llama 3在哪些领域有实际应用?

1.Llama 3在哪些领域有实际应用&#xff1f;Llama 3 凭借其开源、高性能、可微调、支持长上下文和多语言等优势&#xff0c;已在多个领域展现出广泛的实际应用价值。尽管原生版本对中文支持有限&#xff0c;但通过微调&#xff08;SFT/LoRA&#xff09;或结合RAG&#xff08;检…