DAY7 - 454.四数相加II, 383.赎金信, 15.三数之和, 18.四数之和

news/2025/3/20 0:11:24/文章来源:https://www.cnblogs.com/chloechen/p/18782191

454.四数相加II

和昨天那个两数之和为target有点像。

一开始想的是创建四个map分别存数组,但是这样跟暴力算法也没区别。

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> map;int res=0;for(int n1:nums1){for(int n2:nums2){int sum=n1+n2;auto a=map.find(sum);if(a==map.end()){map.insert({sum,1});}else{a->second++;}}}for(int n3:nums3){for(int n4:nums4){auto a=map.find(-n3-n4);if(a!=map.end()){res+=a->second;}}}return res;}
};

小tips:

  • 设置auto a=map.find(sum);在后面要a->second++; 的时候可以避免重复计算,降低时间复杂度。
  • 计算结果数量的时候 res+=a->second;,不能只加一次。

383.赎金信

一开始想到的省事的办法是用unorderd_map,但是题解里面说用um要维护哈希表还有使用哈希函数,费时间,在数据量大的时候更耗时,所以还是使用数组。

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int m[26]={0};for(char c:magazine){m[c-'a']++;}for(char c:ransomNote){if(--m[c-'a']<0) return false;}return true;}
};

可以在代码最前面加上一个判断,减少无用操作,提升运行速度

if (ransomNote.size() > magazine.size()) {return false;}

15.三数之和

尝试使用哈希。

要去重的话一个通用思路是要排序,这样才能把一样的元素放在一起。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());vector<vector<int>> res;for(int i=0;i<nums.size();i++){if(nums[i]>0) break;if(i>0&&nums[i]==nums[i-1]) continue; //去重unordered_set<int> set;for(int j=i+1;j<nums.size();j++){//去重b=c时的情况if (j>i+2 && nums[j]==nums[j-1] && nums[j-1]==nums[j-2]) continue;int target=0-nums[i]-nums[j];if(set.find(target)!=set.end()){res.push_back({nums[i],nums[j],target});set.erase(target);//去重}else{set.insert(nums[j]);}}}return res;}
};

这个去重b==c时候的条件比较难想,还有这个set.erase(target)

通过了但是程序执行时间很长。

双指针写法执行时间快了不少,而且内存消耗也更低。

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

18.四数之和

在一个数组内并且要求去重,和三数之和比较像,考虑用双指针,for循环写两层。

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(),nums.end());vector<vector<int>> res;for(int i=0;i<nums.size();i++){if(nums[i]>target&&nums[i]>=0) break;if(i>0&&nums[i]==nums[i-1]) continue;for(int j=i+1;j<nums.size();j++){if(nums[i]+nums[j]>target&&nums[i]+nums[j]>=0) break;if(j>i+1&&nums[j]==nums[j-1]) continue;int left=j+1;int right=nums.size()-1;while(left<right){long sum=(long)nums[i]+nums[j]+nums[left]+nums[right];if(sum==target){res.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++;else right--;}}}return res;}
};
  • 注意内层循环 if(j>i+1&&nums[j]==nums[j-1]) continue; 要和三数之和用哈希法 if (j>i+2 && nums[j]==nums[j-1] && nums[j-1]==nums[j-2]) continue; 区分。j只要管好自己不要重复就行了。
  • long sum=(long)nums[i]+nums[j]+nums[left]+nums[right]; 提交时提示sum会溢出,所以用long

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

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

相关文章

drm study

学习过程 0319:对于任何驱动来说,buffer是最重要的,知道了buffer的创建使用这个驱动就会一半了;现在感觉是一个无头苍蝇,感觉非常复杂:数据结构非常多,之间的关系也非常复杂;不过没关系,先研究buffer通路;可以看见应用层对mmap写入的hello world,驱动中vkms_obj->…

pcie 简介及引脚定义

随着现代处理器技术的发展,在互连领域中,使用高速差分总线替代并行总线是大势所趋。与单端并行信号相比,高速差分信号可以使用更高的时钟频率,从而使用更少的信号线,完成之前需要许多单端并行数据信号才能达到的总线带宽。 PCI总线使用并行总线结构,在同一条总线上的所有…

C++ 基础(1)

0x01 第一个C++程序 #include <iostream>int main() {std::cout << "Hello World!\n"; } // std::cout 向控制台输出内容的指令 // << 输出的运算符 // "" 字符串内容的边界符 // \n 输出换行 // Hello World 输出字符…

在ubuntu系统下与开发板连接问题记录

对我所遇到的问题以及解决方法进行简单的记录在开发板与ubuntu(非虚拟机)连接之后使用lsmod查看是否连接lsusb 我的显示如下:如果可以看到自己的USB设备 那么就说明你已经安装了驱动 如果没有 请安装你的串口对应的驱动 我的驱动是CH340 没有安装的朋友可以去下面网站进行…

maven为什么发生依赖冲突?怎么解决依赖冲突?

maven为什么发生依赖冲突?怎么解决依赖冲突? 我们在开发的时候,偶尔会遇到依赖冲突的时候,一般都是NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError。打开搜索框又发现有这个类,明明就是引入进来了,就是找不到,让人头疼 1. 依赖冲突场景 在maven中依赖…

unstructured

unstructured 是一个开源的 Python 库,专门用于处理非结构化数据,如从 PDF、Word 文档、HTML 文件等中提取文本内容,并将其转换为结构化格式(1)安装依赖库pip install unstructured使用textfrom unstructured.partition.auto import partitionfilename = "a.txt"…

idea如何激活到2099年

前言 最近发现idea如何激活使用的问题、 网络上各种都是骗关注加各种公众号的最后也没有解决问题,下面分享一下我的激活方法是如何激活到2099年。目前适用于idea的所有版本。我以最新的ideaIU-2024.3为例。 一去官网上下载idea 官网下载地址:https://www.jetbrains.com.cn/id…

202108032324 - kafka的生产流程

由上图可以看出:KafkaProducer有两个基本线程: 主线程: 负责消息创建,拦截器,序列化器,分区器等操作,并将消息追加到消息收集器 RecoderAccumulator中; 消息收集器RecoderAccumulator为每个分区都维护了一个Deque<ProducerBatch> 类型的双端队列。 ProducerBatch…

Cython二进制逆向系列(三)运算符

在这篇文章里,我们会讨论Cython是如何处理运算符的(数学运算符、位运算符、in/not in 运算符、 ==运算符与逻辑运算符)。总的来叔其中大部分是调用虚拟机api来实现的。Cython二进制逆向系列(三)运算符在开始前,先给出本文用到的py源代码 def test1(x, y):# 数学运算符a…

QOJ 9785 Shrooks

曼哈顿距离转切比雪夫距离,对限制的贪心满足,扩宽限制,简化信息首先考虑限制的形式:对于两点 \((x_1, y_1), (x_2, y_2)\),要求 \(|x_1 - x_2| + |y_1 - y_2| \le n\)。 但是这个式子与 \(x_1, x_2, y_1, y_2\) 这 \(4\) 个值都强相关,且这里的绝对值也并不好拆开处理。 …

golang的GC机制

一、垃圾回收 什么是垃圾回收?垃圾回收(GC,garbage collection)是自动内存管理的一种形式,通常由垃圾收集器收集并适时回收或重用不再被对象占用的内存,比如众所周知的Java语言就能很好的支持GC。后起之秀——Go语言也同样支持垃圾回收,它使得Go程序员在编写程序的时候不…

fastjson漏洞复现(fastjson 1.2.47)

原理: Fastjson 的 @type 字段允许反序列化时动态指定类,攻击者可以通过指定带有危险行为的类,并结合 RMI/LDAP 远程加载恶意类,从而实现命令执行。开启vulhub靶场//如何验证是否存在fastjson反序列化漏洞 有json数据传输的地方可能存在 可以尝试使用dnslog带外但是不知道…