【代码随想录训练营第42期 Day7打卡 LeetCode 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

目录

一、做题心得

二、题目及题解

454.四数相加II 

题目链接

题解

383. 赎金信

题目链接

题解

15. 三数之和 

题目链接

题解

18. 四数之和

题目链接

题解

三、小结


一、做题心得

今天是代码随想录训练营打卡的第七天,做的也是同昨天一样的哈希表部分。感觉得出题目难度有所增大,然后我自己的话,最后两个题哈希的方法过于繁琐,做的时间有些久了,放弃了。后边通过题解,慢慢搞懂了双指针的做法(后两个题思路基本一样)。话不多说,直接开始看题。

二、题目及题解

454.四数相加II 

题目链接

454. 四数相加 II - 力扣(LeetCode)

题解

首先说说暴力吧,这个题其实一眼就能看出暴力解法,但也很显然,时间复杂度过高,肯定过不了所有用例。我试着敲了一下,大家可以看看结果,如下:

然后各位可以回想一下,昨天打卡的两数之和(1. 两数之和 - 力扣(LeetCode))那道题,是不是感觉有一些相似。只不过这里变成了四个数组对应的四个值,所以我们要采用分组的思路。把i+j看成一体,把k+l看成一体,用和昨天差不多思路,定义unordered_map<key,value>型哈希表,其中key为i+j的具体的值(和),value为该值出现的次数。对a+b所有可能及其值存储到哈希表中,再通过查找函数等等操作得出结果。(还是不理解的话可以去看看昨天打卡的1.两数之和那道题)

代码如下:

//分组+哈希
class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> hash;    //在这里key为i+j的具体的值(和),value为该值出现的次数int cnt = 0;      //记数for(int i : nums1)          //先存储i+j的值及其对应的个数到哈希表中{for(int j : nums2 ){hash[i+j]++;}}for(int k : nums3){for(int l : nums4){if(hash.find(0 - k - l) != hash.end())     //若hash表中存在满足和为0-k-l的i+j时,cnt加上满足的i+j的个数cnt += hash[0 - k - l];}}return cnt;}
};

383. 赎金信

题目链接

383. 赎金信 - 力扣(LeetCode)

题解

这个题感觉和昨天那个242. 有效的字母异位词 - 力扣(LeetCode)一模一样,比较简单,相信大家都能解决,不会的话可以看看我昨天的打卡或者去搜索巩固一下哈希的基本知识。

代码如下:

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {unordered_map<char,int> hash;for(char ch : magazine){hash[ch]++;}for(char ch : ransomNote){hash[ch]--;if(hash[ch] < 0)      return false;}return true;}
};//分析:由于ransomNote中的元素都能被magazine包含,故ransomNote出现的每一个元素的个数都少于在magzine出现的次数,即原本hash[ch]++后再减也应该大于等于0

15. 三数之和 

题目链接

15. 三数之和 - 力扣(LeetCode)

题解

这个题我感觉作为第一次做还是挺有难度的。如果用哈希做的话,很容易出错,时间上讲也不如双指针来的快。所以这里我们统一学习一下“排序+双指针”的思路。(由于下一道题与这个差不多,我把题解都写在这里,希望不会的各位可以认真看一下下边步骤并结合一下代码思考)

先分析题意,我们将要得到的三个数记作a,b,c(最后分别对应着nums[i],nums[left],nu ms[right])

然后进行以下步骤:
1.初始化结果向量:首先,初始化一个vector<vector<int>>类型的变量ans,用来存储所有满足条件的三元组。
2.排序:对输入的数组nums进行排序,这是为了使用双指针法,并且能够方便地去除重复解。
3.遍历数组:使用一个外层循环遍历数组nums,每次迭代中,当前元素记为a(即nums[i])。
4.去重a:在遍历过程中,如果当前元素a与前一个元素相同,则跳过本次循环(因为前面的迭代中已经考虑过这种情况了,不需要重复计算)。这里需要注意的是,去重a的逻辑应该放在i > 0的条件下,以避免在数组开头漏掉可能的解。
5.双指针法:在内层,使用两个指针left和right,分别指向a之后的第一个元素和数组的最后一个元素。然后,根据三数之和与0的比较结果,移动这两个指针来寻找满足条件的三元组。
6.去重b和c:当找到一个满足条件的三元组时,需要去除b和c(即nums[left]和nums[right])的重复值。这是通过移动指针,跳过与当前b或c相同的元素来实现的。这一步必须放在将当前三元组添加到ans之后进行,以确保不会漏掉任何可能的解。
7.返回结果:当遍历完整个数组后,返回存储了所有满足条件的三元组的ans。

代码如下:(有注释)

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());     //先排序vector<vector<int>> ans;        //由于数组元素为数组,故用嵌套vector存储结果int n = nums.size();if (n < 3)      //特殊情况先考虑return ans;for (int i = 0; i < n - 2; i++) {if (nums[i] > 0) break;                     //提前终止if (i > 0 && nums[i] == nums[i - 1]) continue;      //去重a,避免重复解if (nums[i] + nums[i + 1] + nums[i + 2] > 0) break;     //由于数组已经排过序了,这时不可能存在满足的了,提前终止if(nums[i] + nums[n-1] + nums[n-2] < 0)    continue;    //此时说明a(nums[i])小了,直接返回循环,i+1。(这样可以节省时间,直接跳过后续步骤。)int left = i + 1, right = n - 1;    //使用两个指针left和right,分别指向nums[i]之后的第一个元素和数组的最后一个元素while (left < right) {int sum = nums[i] + nums[left] + nums[right];   //注意sum为a,b,c的和if (sum == 0) {         //满足要求时ans.push_back({ nums[i],nums[left],nums[right] });  //先存入结果while (left < right && nums[left] == nums[left + 1])    left++;  //移动左指针去重b(注意是while语句)while (left < right && nums[right] == nums[right - 1])  right--; //移动右指针去重cleft++;         //每次存放结果后,双指针都移动一位,便于后续下一步判断right--;}else if (sum < 0) left++;         //如果和小于0, 向右移动左指针else right--;       //如果和大于0, 向左移动右指针}}return ans;}
};

18. 四数之和

题目链接

18. 四数之和 - 力扣(LeetCode)

题解

由于和上道题思路差不多,这里可以直接看代码:(代码可能感觉有些长,但是思路其实很清晰,注意看看上一道题的思路和注释,相信你能做出这道题)

class Solution {
public:                  //注意:题目数据要求较大,有些语句要加上longvector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ans;sort(nums.begin(),nums.end());int n = nums.size();if(n < 4)   return ans;for(int i = 0;i < n - 3;i++){if(i > 0 && nums[i] == nums[i-1])continue;if((long)nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target)     break;if((long)nums[i] + nums[n-1] + nums[n-2] + nums[n-3] <target)continue;for(int j = i + 1;j < n - 2;j++){if(j > i + 1 && nums[j] == nums[j-1])continue;if((long)nums[i] + nums[j] + nums[j+1] + nums[j+2] > target)break;if((long)nums[i] + nums[j] + nums[n-1] + nums[n-2] < target)continue;int left = j + 1;int right = n - 1;while(left < right){long sum = (long)nums[i] + nums[j] + nums[left] + nums[right];if(sum == target){ans.push_back({nums[i],nums[j],nums[left],nums[right]});while(left < right && nums[left] == nums[left+1])left++;while(left < right && nums[right] == nums[right-1])right--;left++;right--;}else if(sum < target)left++;elseright--;}} }return ans;}
};

三、小结

今天的打卡到此也就结束了,感觉自己今天的的确确学到了些新东西,还不错吧。后边也会继续更新代码随想录的打卡,不断学习,不断积累自己。最后,我是算法小白,但也希望终有所获。

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

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

相关文章

CUDA编程之grid和block详解

CUDA 文章目录 CUDAgrid和block基本的理解1维 遍历2维 遍历3维 遍历3维 打印对应的thread grid和block基本的理解 Kernel&#xff1a;Kernel不是CPU&#xff0c;而是在GPU上运行的特殊函数。你可以把Kernel想象成GPU上并行执行的任务。当你从主机&#xff08;CPU&#xff09;调…

使用Chainlit接入通义千问快速实现一个多模态的对话应用

开通灵识服务 首先需要到阿里云-模型服务灵积开通账户&#xff0c;获得apiKey 模型服务灵积 https://dashscope.aliyun.com/ 进入控制台 &#xff0c;在API-KEY管理里&#xff0c;创建一个新的API-KEY,然后保存起来&#xff0c;后面会用到。 模型服务灵积服务所有API文档地址…

KUKA机器人外部自动IO信号经验分享

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

k8s学习--k8s集群部署kubesphere的详细过程

文章目录 kubesphere简介k8s群集部署kubespere环境准备工作一、配置nfs二、配置storageclass三、kubesphere开启服务(devops) kubesphere简介 下面是官方文档描述 KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统&#xff0c;完全开源&#xff0c;支持多…

【python】最新版抖音js逆向拿到数据,非常详细教程(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

如何压缩pdf文件大小?这5种方法,简单又实用!

如何压缩pdf文件大小&#xff1f;pdf是电脑常用的便携式文档格式&#xff0c;无论是在学术领域的论文发表&#xff0c;还是在商业场景中的合同签署&#xff0c;甚至是个人简历的提交&#xff0c;PDF文件都扮演着重要的角色。 电脑上存储pdf文件会面临一个难题&#xff0c;那就是…

收不到验证码邮件怎么办?快速排查与解决!

收不到验证码邮件有哪些应对策略&#xff1f;验证码邮件被拦截&#xff1f; 经常需要通过邮箱接收验证码邮件来完成各种操作。然而&#xff0c;许多人都会遇到收不到验证码邮件的情况。AokSend将详细介绍如何快速排查和解决收不到验证码邮件的问题。 收不到验证码邮件&#x…

pake 打包TodoList windows桌面应用exe

参考&#xff1a; rust安装 https://blog.csdn.net/weixin_42357472/article/details/125943880 pake网址 https://github.com/tw93/Pake 支持把网页打包成多终端应用 离线网站打包参考&#xff1a; https://github.com/tw93/Pake/wiki/Pake%E6%89%93%E5%8C%85%E9%9D%99%E6%8…

企业微信开发智能升级:AIGC技术赋能,打造高效沟通平台

文章目录 一、AIGC在企业微信开发中的核心价值1. 智能化客服体验2. 自动化工作流程3. 个性化内容推荐4. 深度数据分析与洞察 二、使用AIGC进行企业微信开发的实践路径1. 需求分析与场景定义2. 技术选型与平台搭建3. 模型训练与调优4. 接口对接与功能集成5. 测试与优化 《企业微…

Hugo 部署与自动更新(Git)

文章目录 Nginx部署Hugonginx.confhugo.conf Hugo自动更新Hugo自动更新流程添加访问令牌添加web hookrust实现自动更新接口 Nginx部署Hugo nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;even…

python-小李帮老师改错(赛氪OJ)

[题目描述] 老师给小理发了一封电子邮件&#xff0c;任务如下。 写一个程序&#xff0c;给你 n 个数&#xff0c;输出 X。Xnum1p1​​num2p2​​⋯numnpn​​。 num1​&#xff0c;num2​&#xff0c;⋯⋯&#xff0c;numn​ 都是整数&#x…

【脱敏】平台数据脱敏技术解决方案(word)

1 概述 1.1 数据脱敏定义 1.2 数据脱敏原则 1.2.1基本原则 1.2.2技术原则 1.2.3管理原则 1.3 数据脱敏常用方法 3.1.1泛化技术 3.1.2抑制技术 3.1.3扰乱技术 3.1.4有损技术 1.4 数据脱敏全生命周期 2 制定数据脱敏规程 3 发现敏感数据 4 定义脱敏规则 5 执…

02 Go语言开发REST API接口_20240728 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础 基础不好的同学每节课的代码最好配合视频进行阅读和学习&#xff0c;如果基础比较扎实&#xff0c;则阅读本教程巩固一下相关知识点即可&#xff0c;遇到不会…

探索Python监控之眼:watchdog库深度解析

文章目录 探索Python监控之眼&#xff1a;watchdog库深度解析1. 引言&#xff1a;为何选择watchdog&#xff1f;2. watchdog简介3. 安装watchdog库4. 基本函数与使用方法4.1 初始化监控器4.2 监控文件的创建4.3 监控文件的删除4.4 监控目录的创建4.5 监控目录的删除 5. 场景应用…

IoTDB 入门教程 实战篇②——MQTT集成

文章目录 一、前文二、配置参数三、开放端口四、MQTT客户端连接五、推送数据六、查询数据八、参考 一、前文 IoTDB入门教程——导读 IoTDB时序数据库内置MQTT服务器&#xff0c;允许远程设备将消息直接发送到IoTDB内置的MQTT服务器&#xff0c;并可以直接存入IoTDB时序数据库。…

gitee的远程连接与公钥SSH的连接

目录 1. 登录注册gitee1.1 登录注册1.2 创建仓库 2. 远程连接3. 公钥连接4. 参考链接 1. 登录注册gitee 1.1 登录注册 gitee官网 进入后进行登录注册 1.2 创建仓库 2. 远程连接 在你想要上传文件的文件夹中进行git初始化&#xff08;我在其他文章已经写过&#xff0c;链接…

新手小白,如何新建一个springboot的web项目?

第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选择java8版本 ④选择jar包类型 http://t.csdnimg.cn/XeplRhttp:…

ICMPv6与DHCPv6之网络工程师软考中级

ICMPv6概述 ICMPv6是IPv6的基础协议之一。 在IPv6报文头部中&#xff0c;Next Header字段值为58则对应为ICMPv6报文。 ICMPv6报文用于通告相关信息或错误。 ICMPv6报文被广泛应用于其它协议中&#xff0c;包括NDP、Path MTU发现机制等 ICMPv6控制着IPv6中的地址自动配置、地址…

tarojs项目启动篇

TaroJS 是一个开放式跨端开发解决方案&#xff0c;使用 React 语法规范来开发多端应用&#xff08;包括小程序、H5、React Native 等&#xff09;。它可以帮助开发者高效地构建出在不同端上运行一致的应用。以下是启动 TaroJS 项目&#xff08;本来就有的旧项目&#xff09;的步…

OTA远程升级语音芯片”在线更新语音内容的方式有哪几种?分别如何使用及有什么优势?

一&#xff1a;【在板更新】在PCBA上预留语音芯片烧录口,通过配套下载器更新语音芯片中的语音文件。 如何使用,有什么优势? 1.研发设计阶段、调试阶段可以使用下载器更换PCBA上面的语音文件&#xff0c;无需重新购买IC,大大缩短项目周期。 2.产品一样,但是需要出口到不同国…