day7 哈希表(二)

Day7 哈希表(二)
2023.12.6
深感抱歉,这几天事情太多了,昨天跟导师出差,整理资料到半夜,一直没空打卡学习,今晚难得有空,先将昨天12.5日的任务补上。

1. 454四数相加Ⅱ
这道题其实还是很好理解的,四个数组的匹配问题,麻瓜一点就是四层for,显然不是我们想要的最优解,尽量减少时间复杂度。延续之前做哈希表题的思想,固定一个值,然后找另一个值。但此处是四个值,因此需要做组合,两两组合或者三一分配。显然两两组合时间复杂度小一点,将四个值变为两个值匹配。分别两层for,将四值之和变为两值之和。
另一个技巧,本题找的是和为0的,我们转换成两个值后,也就是互为相反数,因此代码逻辑比之前的要简单一些。直接看另一个数是否在哈希表中即可。

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int, int> map;for(int a:nums1){  //二合一for(int b:nums2){map[a+b]++;}}int count=0;for(int c:nums3){ //二合一且查找匹配for(int d:nums4){if(map.find(0-(c+d))!=map.end()){count += map[0-(c+d)];}}}return count;}
};

2. 383赎金信
这道题很简单,做了之前的哈希表问题,再看这道题就很easy了,将对照字符串遍历,值++;然后遍历待处理字符串,值–;最后遍历map,如果有值<0的,那就问题啦!

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {unordered_map<int,int> map;for(char s:magazine){map[s-'a']++;}for(char s:ransomNote){map[s-'a']--;}for(auto i = map.begin();i!=map.end();i++){if(i->second<0){return false;}}return true;}
};

3. 15三数之和
这道题最开始我就想的继续用map,但代码逻辑很乱,一直写不出来,最后看代码随想录,emmm,绷不住了,这种方法果然不是最优解,本题应该使用双指针,即一个for控制遍历,然后定义一个指针指向i+1,另一个指向末尾。不过,前提是数组要先排序!很巧妙,然后三者值相加,判断大于零还是小于零,大于零,那正数就要变小,所以右侧的左移。小于零,负数要变大,因此左侧的要右移。整体逻辑简单。但存在很多细节。
1.如果遍历i的值,nums[i]都是大于0的,那还有必要继续吗?最小值大于零,三者之和肯定不能为0了。因此直接return。
2.题目要求不重复,就要对三个数进行删选,即相邻值相同的略过

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

4. 18四数之和
本题与三数之和相同,但外面多一层循环,并且,这次target是指定值,因此在剪枝操作就不能>0就return了,具体代码(用的代码随想录原始代码,因为在出差期间,时间不够,就偷个懒。。。)如下:

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;}
};

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

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

相关文章

一次重新加载所有 maven 项目产生的 OOM

1、解决什么问题&#xff1f; 忘了截图了&#xff0c;用文字描述就是由于Reload All Maven Projects导致的 OOM 异常。 2、尝试与解决 2.1、尝试 2.1.1、尝试清理idea缓存&#xff08;无效&#xff09; 2.1.2、重启idea&#xff08;无效&#xff09; 2.1.3、重启电脑&am…

【LeetCode】258. 各位相加

258. 各位相加 难度&#xff1a;简单 题目 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个结果。 示例 1: 输入: num 38 输出: 2 解释: 各位相加的过程为&#xff1a; 38 --> 3 8 --> 11 11 --> 1 1 --&g…

数树问题(桶排序)

某校大门外长度为L的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴&#xff0c;马路的一端在数轴0的位置&#xff0c;另一端在L的位置&#xff1b;数轴上的每个整数点&#xff0c;即0&#xff0c;1&#xff0c;2&#xff0c;……&am…

nginx遇到的问题和jks密码问题

1&#xff1a;nginx的配置&#xff1a; https 一定得配置 8080 ssl (我没有配置这个) 2&#xff1a;查看jks的密码 keytool -list -keystore secms.jks 让输入密码

锂电分切机常见故障及预测性维护解决方案

锂电分切机是电池生产线上不可或缺的设备&#xff0c;通过切割锂电池以满足不同应用需求。但在实际生产的使用过程中&#xff0c;常常会遇到一些故障&#xff0c;影响设备的正常运行和生产效率。为了减少这些故障对设备的影响&#xff0c;预测性维护成为制造商需要重视的解决方…

Linux动态库常见问题

1.编译好库后&#xff0c;应用程序调用&#xff0c;路径明明写对了&#xff0c;但是编译的时候却显示xxx未定义 2.编译好了却说不能打开动态库&#xff0c;没有此文件 ./jrtplib_test: error while loading shared libraries: libjrtp.so.3.11.2: cannot open shared object f…

java面试题,上楼梯有多少种方式

java面试题&#xff0c;上楼梯有多少种方式 题目&#xff1a;一个小孩上一个N级台阶的楼梯&#xff0c;他可以一次走1阶、2阶或3阶&#xff0c;那么走完N阶有多少种方式。 很自然的想法是使用递归&#xff1a; public class Test04 { public static int countWays(int n) {…

python初始化矩阵相关

做算法题经常需要初始化一个二维的dp数组 下面两种方法是最常用的 matrix [[0]*n]*n matrix [[0]*n for _ in range(n)]以前经常混用也没发现什么问题&#xff0c;直到昨天debug的时候发现第一种初始化之后对矩阵进行赋值时混乱的&#xff0c;比如matrix[0][1]2会导致所有行…

C语言面试之旅:掌握基础,探索深度(面试实战之单片机——IO)

梦想和自由一样&#xff0c;都有代价&#xff0c;但都值得。 ----小新 引言 单片机是一种微控制器&#xff0c;它包含一个处理器、存储器、定时器和I/O端口等。I/O端口是单片机与外部设备进行通信的接口。通过I/O端口&#xff0c;外部设备可以输入和输出数据到单片机中。 在单…

西工大计算机学院计算机系统基础实验一(函数编写1~10)

还是那句话&#xff0c;千万不要慌&#xff0c;千万不要着急&#xff0c;耐下性子慢慢来&#xff0c;一步一个脚印&#xff0c;把基础打的牢牢的&#xff0c;一样不比那些人差。回到实验本身&#xff0c;自从​​​​​​按照西工大计算机学院计算机系统基础实验一&#xff08;…

YOLOv8改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)

一、本文介绍 本文给大家带来的改进是Triplet Attention三重注意力机制。这个机制&#xff0c;它通过三个不同的视角来分析输入的数据&#xff0c;就好比三个人从不同的角度来观察同一幅画&#xff0c;然后共同决定哪些部分最值得注意。三重注意力机制的主要思想是在网络中引入…

C陷阱与缺陷——第6章 预处理器

在严格意义上的编译过程开始之前&#xff0c;C语言预处理器首先对程序代码做了必要的转换处理。预处理器的主要作用是&#xff1a; 我们有时需要将某个特定数量在程序中出现的所有实例统统加以修改大多数C语言实现在函数调用时都会带来重大的系统开销 1. 不能忽视宏定义中的空…

基于Java停车场管理系统

功能需求 1、用户注册和登录&#xff1a;系统需要提供用户注册和登录的功能&#xff0c;使得用户可以创建账户并保护他们的个人信息。 2、车辆管理&#xff1a;能够记录并跟踪进出停车场的车辆信息&#xff0c;包括车牌号、车型、颜色等。 3、停车位管理&#xff1a;显示停车…

EPICS Base 和许多未捆绑的 EPICS 扩展和支持模块

针对物理实验的实验装置驱动操作 网址&#xff1a;https://epics-controls.org/epics-open-license/ 关于EPICS复杂系统 EPICS 是一套软件工具和应用程序&#xff0c;为建立分布式控制系统提供软件基础设施&#xff0c;用于操作粒子加速器、大型实验和大型望远镜等设备。这种…

Kontakt v7.7.2(音频采样器)

Native Instruments Kontakt 7是一款强大的软件采样器&#xff0c;它允许用户从各种来源采样音频并进行编辑和处理。它包含大量预设采样库&#xff0c;包括乐器、合成器、鼓组和声音效果等。此外&#xff0c;Kontakt 7还允许用户创建自己的采样库&#xff0c;以便根据自己的需要…

电脑版的便签软件使用哪一款?

您会选择使用电脑便签软件吗&#xff1f;很多人在日常工作及生活中会选择用电脑便签来督促自己按时完成工作任务&#xff0c;而且选择电脑便签是一个难题&#xff0c;毕竟当前电脑便签类工具非常多&#xff0c;如果想要找一款功能比较强大且又简单易用的便签工具&#xff0c;那…

HarmonyOS学习--创建和运行Hello World

创建和运行Hello World 打开DevEco Studio&#xff0c;在欢迎页单击Create Project&#xff0c;创建一个新工程。根据工程创建向导&#xff0c;选择创建Application应用或Atomic Service元服务。选择“Empty Ability”模板&#xff0c;然后单击Next。关于工程模板的介绍和支持…

A股股票交易费用

A股股票交易费用如下&#xff1a; 经手费&#xff1a;&#xff08;上证/深证&#xff09;按成交额双边收取0.0487‰&#xff0c;交给交易所。 监管费&#xff1a;&#xff08;深证&#xff09;按成交额双边收取0.02‰&#xff0c;交易所代收&#xff0c;交给证监会。 证管费&…

QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』

前文链接&#xff1a;QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』 前一篇文章提到的异步单瓦片加载&#xff0c;是指线程每准备好一个瓦片数据后&#xff0c;立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后&#xff0c;一起抛出信号让…

将文件夹中所有文件名取出

dir C:\Users\是啊\Desktop\实验五/b>C:\Users\是啊\Desktop\1111.xls C:\Users\是啊\Desktop\实验五&#xff08;这个是文件夹路径&#xff09; /b &#xff08;参数&#xff09; C:\Users\是啊\Desktop\1111.xls&#xff08;文件名输出的文件路径&#xff09;