Day7——四数相加||、赎金信、三数之和、四数之和

news/2024/5/3 16:14:51/文章来源:https://blog.csdn.net/m0_72503424/article/details/127395576

算法训练的第七天

目录

前言

一、四数相加||

暴力解法思路:

哈希解法思路:

二、赎金信

解题思路:

三、三数之和

解题思路:

四、四数之和:

解题思路:

总结


前言

今日文案:

许多事情看似不可能,但在敢为人先的勇敢和坚韧执着的发奋下,会变成可能,会变成事实。看追的事情就去做,追求就有期望,发奋就有可能。


一、四数相加||

题目来源:

力扣

暴力解法思路:

四数相加==0,知道一个结果,求出四个下标。我们最容易想到暴力解法,四个for循环嵌套来一个一个遍历,枚举,但时间复杂度就去到了恐怖的O(n^4),可以,但不好。

哈希解法思路:

我们要求的是一个结果值,好像和之前查找字符串是不是相等一样,我们只需要一个++,一个--,最后数组等于0就能说明完全契合,那相加==0,不就是相反数契合吗。那四个数组,我们只需要两两组合,找出他们的结果集,再哈希就可以解决这道题了,时间复杂度也回到了O(n^2),

代码如下:

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> map;int target=0,count=0;        for(int i=0;i<nums1.size();i++)            //循环遍历出每一个结果值{for(int j=0;j<nums1.size();j++){map[nums2[j]+nums1[i]]++;}}for(int i=0;i<nums1.size();i++){for(int j=0;j<nums1.size();j++){target=0-(nums3[i]+nums4[j]);   //target-结果值就是我们要从上面结果值找的数if(map.find(target)!=map.end())    //查找count=count+map[target];            //因为里面可能不止一个符合的结果值}}return count;}
};


二、赎金信

题目来源:

力扣

解题思路:

我们要干嘛?我们要在一个集合里找元素的个数是否和另外一个集合的元素个数相等,还是字母,26个,我们只需要使用哈希数组结构就能轻松实现。

代码如下:

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int hash[26]={0},a=1;for(int i=0;i<ransomNote.size();i++){hash[ransomNote[i]-'a']++;}for(int i=0;i<magazine.size();i++){hash[magazine[i]-'a']--;}for(int i=0;i<26;i++){if(hash[i]>0)a=0;};if(a==0)return false;elsereturn true;}
};

前面的博客有写过数组解法,就不多解释了。


三、三数之和

题目描述:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

题目来源:

力扣

解题思路:

可能有朋友看到这题,会马上想到四数相加||,这乍一看确实很像,但是仔细看看,好像又不一样了,我们这里的三元组是不重复的,而且i != j、i != k 且 j != k,要是要用哈希法的话,会很麻烦,具体我也不会。

我们在这里可以用一个双指针的思路。下面是一些比较重要的点,如图:

 细节的点我会在代码上标明:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());        //排序int i=0,left,right;vector<vector<int>> ans;for(i=0;i<nums.size();i++){left=i+1;right=nums.size()-1;if(nums[i]>0)                    //最小值大于0,说明不可能再有和==0了return ans;if(i>0&&nums[i]==nums[i-1])    //如果后面的值等于前面那个,那个数的所有结果集都continue;                        //已经用过了,直接下一层循环while(right>left){    //这个条件是必要的if(nums[i]+nums[left]+nums[right]>0){right--;                            //值大就左移right拉小}else if(nums[i]+nums[left]+nums[right]<0){left++;                                //值大就右移left拉大}else if(nums[i]+nums[left]+nums[right]==0){ans.push_back(vector<int>{nums[i], nums[left], nums[right]});//保存while(right>left&&nums[right]==nums[right-1])    //判断重复{right--;}while(right>left&&nums[left+1]==nums[left]){left++;}left++;                //指针收缩right--;}}}return ans;}
};

四、四数之和:

题目描述:

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

题目来源:

力扣

解题思路:

与上面的有点像,但是剪枝和查重部分,有出入,直接上代码:

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ans;sort(nums.begin(),nums.end());int k,left,right;for(k=0;k<nums.size();k++){if(k>0&&nums[k]==nums[k-1]){continue;}if(nums[k]>=0&&nums[k]>target){break;}for(int i=k+1;i<nums.size();i++){if(nums[i]+nums[k]>=0&&nums[i]+nums[k]>target){break;}if(i>k+1&&nums[i]==nums[i-1]){continue;}left=i+1;right=nums.size()-1;while(left<right){if((long)nums[i]+nums[k]+nums[left]+nums[right]>target){right--;}else if((long)nums[i]+nums[k]+nums[left]+nums[right]<target){left++;}else{ans.push_back(vector<int>{nums[i],nums[k],nums[left],nums[right]});while(left<right&&nums[left+1]==nums[left])left++;while(left<right&&nums[right-1]==nums[right])right--;left++;right--;}}}}return ans;}
};


总结

继续每天进步一点点。

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

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

相关文章

在哪能查到英文论文?

不论是撰写英文论文还是引用外文文献&#xff0c;写论文的过程中想必缺不了检索合适的英文论文这个步骤&#xff0c;在本篇内容里&#xff0c;不仅教会你如何查到英文论文&#xff0c;还要教会你怎么样快速找到合适的英文论文&#xff01;听起来是不是令人心驰神往&#xff0c;…

facebook、Netflix 10倍速工程效能提升实践

工程效能是什么呢&#xff1f;工程效能是研发团队能够持续为用户产生有效价值的效率&#xff0c;包括有效性、效率和可持续性三个方面。一提到工程效能&#xff0c;大家脑子里马上会浮现持续构建、持续发布、开发流程改进等词汇&#xff0c;往往会忽略有效性。有效性&#xff0…

若依微服务项目本地启动

1.项目地址 https://gitee.com/y_project/RuoYi-Cloud 使用git本地克隆 git clone https://gitee.com/y_project/RuoYi-Cloud2.导入数据库 1.将下图的两个数据库导入ry-cloud数据库 2.导入nacos和seata的数据库里面有键数据库语句直接运行即可 3.下载nacos 1.下载地址 http…

05-运算符

文章目录算数运算符算数运算符执行的优先级顺序赋值运算符一元运算符自增运算符使用比较运算符逻辑运算符运算符优先级 *算数运算符 掌握算数运算符&#xff0c;能写出一些具备运算能力的小程序 数学运算符也叫算数运算符&#xff0c;主要包括加、减、乘、除、取余&#xff0…

ArcGIS中高风险地区热力图制作

一、数据来源及介绍 吉林省长春市中高风险地区名录 登陆微信&#xff0c;查找国家政务服务平台小程序&#xff0c;点击各地疫情风险等级查询&#xff0c;即可查看各地区中高风险地区所在地。 长春市行政边界数据 行政边界数据来源于阿里云数据可视化平台&#xff08;DataV…

后缀数组原理

一 点睛 在字符串处理中&#xff0c;后缀树和后缀数组都是非常有力的工具&#xff0c;后缀数组是后缀树的一个非常精巧的替代品&#xff0c;比后缀树更容易实现&#xff0c;可以实现后缀树的很多功能&#xff0c;时间复杂度也不逊色&#xff0c;比后缀树所占用的空间也小很多。…

0 引言和准备

14天阅读挑战赛 努力是为了不平庸&#xff01;这句话可能有些道理 本文概要&#xff1a; 本专栏是想挑战下阅读《趣味算法》一书&#xff1b; 本文主要是开读前&#xff0c;记录一下对本书的理解&#xff0c;和设定一个计划目标。同时&#xff0c;也简单总结了下&#xff0c;对…

DES加密原理描述与分析

目录1.简介2.加密原理2.1 加密步骤2.2 子密钥生成3.解密原理4.安全性5. 3DES 1.简介数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。…

【linux】 第4回 Xshell安装操作

1. 虚拟机关键配置名词解释 1. 虚拟⽹络编辑器说明桥接模式(可以访问互联⽹!!!)配置的地址信息和物理主机⽹段地址信息相同, 容易造成地址冲突NAT模式(可以访问互联⽹!!!)配置的地址信息和物理主机⽹段地址信息不同, 造成不了地址冲突仅主机模式 (不可以访问互联⽹)获取…

GIS Office国产基础软件,助力移动通信基础资源管理建设工程

万物互联&#xff0c;移动5G时代的蓬勃发展&#xff0c;为我们带来高速率、低时延、大连接的网络与通信体验&#xff0c;这离不开移动通信的基础资源管理建设工程。 面对种类繁多、设备资源管理要求极高且庞大的设备量&#xff0c;如何建立一个简单、高效的设备管理流程&#x…

AWS云服务器申请

目录 一、云服务器申请 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;准备工作 &#xff08;三&#xff09;申请 &#xff08;四&#xff09;创建实例 &#xff08;五&#xff09;配置弹性IP &#xff08;六&#xff09;连接服务器实例 &#xff08;七&am…

Android studio 最新版本(2022.3.1)的Logcat用法

1 1、package: 以包名过滤日志&#xff0c; 预设 package:mine 表示用当前运行的应用包名进行过滤 2、level: 以优先级过滤日志 level:VERBOSE // 显示所有信息 level:DEBUG // 显示调试信息 level:INFO // 显示一般信息 level:WARN // 显示警告信息 level:ERROR // 显示…

Excel的简单编程

Excel的简单编程 主要内容&#xff08;这张图里有上索引[A,B,C……]&#xff0c;左索引[1,2,3……]&#xff0c;方便理解语法&#xff09; 内容同上&#xff08;该表主要是为了方便复制&#xff09; 算法d1d2d3d4d5举例语法输出加法12~~~d1d2“B2C2”3减法12~~~d2-d1“C3-B3”…

BSP Day48

今天继续来看看文件的东西 FILE结构体 C语言的stdio.h头文件中&#xff0c;定义了用于文件操作的结构体FILE。这样&#xff0c;我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作。可以在stdio.h(位于visual studio安装目录下的include文件夹下)头文件中查…

【交叉编译踩坑指北(三)】Linux下VScode构建数莓派Pico开发环境

写在前面 第二章表明,arm-none-eabi工具虽然单独使用会报错,但是只要结合CMake就可以正常使用.   而Window系统下,使用CMake调用MinGW Makefiles,那么是不是可以在Linux下使用CMake调用Linux原生make(即Unix Makefiles)构建目标文件呢?这个问提就好比出发点相同(都是CMake),…

linux 内核编译问题汇总

一、编译设备树时找不到设备树包含的头文件设备树包中包含的头文件会到kernel/scripts/dtc/include-prefixes/dt-bindings目录下去查找(新版本内核),而dt-bindings目录是软链接到kernel/include/dt-bindings目录下的。include-prefixes下的其它目录也都是软连接,如下所示如果…

【ARM】使用Busybox构建根文件系统

Busybox构建根文件系统介绍下载配置busybox配置交叉编译器取消静态库编译添加vi命令的支持取消简化模块支持mdev中文支持编译完善根文件系统创建必要文件夹复制库启动文件etc/init.d/rcS/etc/fstab/etc/inittab根文件系统的打包测试网络测试程序运行测试自启动测试介绍 BusyBo…

《数据分析与处理》第二周实验

② s “ajldjlajfdljfddd”&#xff0c;去重并从小到大排序输出[‘a’, ‘d’, ‘f’, ‘j’, ‘l’]。 s "ajldjlajfdljfddd" print(sorted(list(set(s))))③ 使用列表推导式求列表a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]所有奇数并构造新列表[1,3,5,7,9]。 a [1,…

Confidential Containers:云原生机密计算基础设施

文/龙蜥社区云原生 SIG 前言部分 机密容器是 Cloud Native Computing Foundation&#xff08;CNCF&#xff09;下的一个新的 Sandbox 项目。机密容器项目基于 CPU 可信执行环境&#xff08;TEE&#xff09;技术&#xff0c;并与云原生容器以及 Kubernetes 技术结合&#xff0c…

记录清理Oracle归档日志

一、登录数据库 1. 切换到Oracle用户 su命令 – 切换用户身份su命令来自于英文单词“switch user”的缩写,其功能是用于切换用户身份。管理员切换至任意用户身份而无需密码验证,而普通用户切换至任意用户身份均需密码验证。另外添加单个减号(-)参数为完全的身份变更,不保留…