二刷代码随想录算法训练营第七天 |454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

目录

一、454. 四数相加 II

二、383. 赎金信

三、15. 三数之和18. 四数之和


一、454. 四数相加 II

题目链接:力扣

文章讲解:代码随想录

视频讲解: 学透哈希表,map使用有技巧!LeetCode:454.四数相加II

题目:

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

代码:

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> map;int ans=0;/*for(int i=0;i<nums1.size();i++)//两组合一{for(int j=0;j<nums1.size();j++){map[nums1[i]+nums2[j]]++;}}for(int i=0;i<nums1.size();i++)//两组合一{for(int j=0;j<nums1.size();j++){// if(map.find(-(nums3[i]+nums4[j])) != map.end())//hash查询增加时间ans += map[-(nums3[i]+nums4[j])];//默认构造0}}*/for(int &i:nums1)//指针速度更快for(int &j:nums2)map[i + j]++;for(int &i:nums3)for(int &j:nums4)//if(map.find(-(i+j)) != map.end())//hash查询增加时间ans += map[-(i+j)];//默认构造0return ans;}
};
//用哈希数组替代map减去哈希计算的时间。
class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());sort(nums3.begin(), nums3.end());sort(nums4.begin(), nums4.end());int n = nums1.size();int low = min(nums1[0]+nums2[0], -nums3[n-1]+-nums4[n-1]);int high = max(nums1[n-1]+nums2[n-1], -nums3[0]+-nums4[0]);int range = high - low + 1;vector<int> hash(range, 0);int ans = 0;for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)hash[nums1[i]+nums2[j] - low]++;for(int i = 0; i < n; i++)for(int j = 0; j < n; j++){int find = -nums3[i]+-nums4[j]-low;if (hash[find] != 0)ans += hash[find];}return ans;}
};

时间复杂度: O(n^2)                                        空间复杂度: O(n^2)

⏲:8:52

总结:1.将map当数组用,其下标相当于key,数组的值则为value。2.若访问map中不存在的值,就会构造一对key和value,且value为0。3.循环用指针的速度大于变量。4.形如x1+x2+....=k可变成x1=k-x2-x3... 方便查找。

二、383. 赎金信

题目链接:力扣

文章讲解:代码随想录

视频讲解:

题目:给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。

代码:

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

时间复杂度: O(n)                                        空间复杂度: O(1)

⏲:2:26

三、15. 三数之和18. 四数之和

15题目链接:力扣

18题目链接:力扣

文章讲解:代码随想录

视频讲解:梦破碎的地方!| LeetCode:15.三数之和

题目:

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

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

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

代码:

三数之和:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {
//哈希/*sort(nums.begin(), nums.end());vector<vector<int>> ans;int size = nums.size();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++) {if (j > i+2 && nums[j] == nums[j-1] && nums[j-1] == nums[j-2]) continue;int t = -(nums[i] + nums[j]);if (set.find(t) != set.end()) {ans.push_back({nums[i], nums[j], t});set.erase(t);} else set.insert(nums[j]);}}return ans;*/
//双指针sort(nums.begin(), nums.end());vector<vector<int>> ans;int size = nums.size();for(int i = 0; i < size-2; i++){if (i>0 && nums[i] == nums[i-1]) continue;for(int left = i+1, right = size-1; left<right;){int sum = nums[i] + nums[left] + nums[right];if (sum>0) right--;else if(sum<0) left++;else{ans.push_back({nums[i],nums[left],nums[right]});while(left < right && nums[left]==nums[left+1]) left++;while(left < right && nums[right]==nums[right-1]) right--;right--;left++;}}}return ans;}
};

四数之和:

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

总结:1.剪枝:根据第一个数考虑后续相应数不可能成立的情况。2.去重:与前一个数比较是否相同,可以保障已经走过一遍,且第一个数的重复数的后续数的所有情况被包含于第一个数的前数中。中间原理相同。最后双指针部分,在保障已经有一次的情况下走完以避免直接退出循环。3.时间复杂度双指针降低一阶。双向指针可以快速跳过左右重复或差值过大的数。

哈希与双指针的适用:

  1. 哈希法:不要求去重(去重繁琐) 或 要求返回元素下标(双指针需要排序)
  2. 双指针法:要求去重 不要求返回元素下标

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

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

相关文章

蓝桥杯前端Web赛道-课程列表

蓝桥杯前端Web赛道-课程列表 题目链接&#xff1a;0课程列表 - 蓝桥云课 (lanqiao.cn) 题目要求如下&#xff1a; 分析题目我们发现其实就是需要我们手写一个分页的功能&#xff0c;根据题目的要求&#xff0c;分析如下 需要通过axios获取数据每页显示5条数据&#xff0c;默…

P1927 防护伞

题目传送门 题目描述 据说 2012 的灾难和太阳黑子的爆发有关。于是地球防卫小队决定制造一个特殊防护伞&#xff0c;挡住太阳黑子爆发的区域&#xff0c;减少其对地球的影响。由于太阳相对于地球来说实在是太大了&#xff0c;我们可以把太阳表面看作一个平面&#xff0c;中心…

黑马程序员java部分笔记(持续更新)九点六:数组的常见操作

数组的常见操作&#xff1a; 求最值 求和 交换数据 打乱数据 ---------------------------------------------------------------------------------------------------------------------------------1.求最值&#xff1a;【个人建议看看B站上的视频&#xff0c;提有意思的】…

11.vue学习笔记(组件生命周期+生命周期应用+动态组件+组件保持存活)

文章目录 1.组件生命周期2.生命周期应用2.1通过ref获取元素DOM结构2.2.模拟网络请求渲染数据 3.动态组件3.1.A&#xff0c;B两个组件 4.组件保持存活&#xff08;销毁期&#xff09; 1.组件生命周期 每个Vue组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置…

Android摄像头横屏的时候_人脸预览横向显示_问题解决---Android原生开发工作笔记164

在Android系统的平板中发现一个问题,我们做的一个Android程序,横屏的时候,摄像头在上面, 然后这个时候程序中的一个人脸预览页面,横向手持平板,摄像头在上面,但是这个时候预览的摄像头画面却是很像头像朝左,也是横过来的. private int getCameraOrientation(int cameraId) {Ca…

Rocky Linux安装部署Elasticsearch(ELK日志服务器)

一、Elasticsearch的简介 Elasticsearch是一个强大的开源搜索和分析引擎&#xff0c;可用于实时处理和查询大量数据。它具有高性能、可扩展性和分布式特性&#xff0c;支持全文搜索、聚合分析、地理空间搜索等功能&#xff0c;是构建实时应用和大规模数据分析平台的首选工具。 …

Linux学习之system V

目录 一&#xff0c;system V共享内存 快速认识接口 shmget(shared memory get) shmat(shared memory attach) shmdt(shared memory delete) shmctl (shared memory control) 编写代码 综上那么共享内存与管道通信有什么区别&#xff1f; system v消息队列 system v信号…

《Effective C++》- 极精简版 41-55条

本文章属于专栏《业界Cpp进阶建议整理》 继续上篇《Effective C》- 极精简版 31-40条。本文列出《Effective C》的41-55条的个人理解的极精简版本。 40、谨慎使用多重继承 个人见解&#xff1a;这是一个性价比不高的功能&#xff0c;容易出错&#xff0c;且收益不高。java语言…

代码随想录训练营总结篇

1:刚开始学习了数据结构的时候,碰到一些树图等有点畏难,感觉刷力扣跟是一件恐怖的事情 2:在网上找了很多关于数据结构与算法的视频讲解,有听进去,但是自己动手写有点困难 3:碰到一些比较复杂的问题时需要与人讨论,加了一些代码随想录中的群,发现这里是学习算法 的天堂,大家都…

【深度学习笔记】深度卷积神经网络——NiN

网络中的网络&#xff08;NiN&#xff09; LeNet、AlexNet和VGG都有一个共同的设计模式&#xff1a;通过一系列的卷积层与汇聚层来提取空间结构特征&#xff1b;然后通过全连接层对特征的表征进行处理。 AlexNet和VGG对LeNet的改进主要在于如何扩大和加深这两个模块。 或者&am…

Android 14 权限

问题Android 14 按照视频播放类的应用 无法获取到权限。 原因是从 Android 13 开始&#xff0c;如果你的应用程序 targetSdk 指定到了 33 或以上&#xff0c;那么 READ_EXTRERNAL_STORGE 权限就完全失去了作用&#xff0c;申请它将不会产生任何效果。 与此相对应的&#xff0c…

C编程学习资源汇总

Study Soures Pool 基础:推荐 C Primer Plus 第6版 中文版 + C Primer Plus 第6版 中文版习题解答 进阶:推荐使用小甲鱼的学习视频,课程细致,而且免费,资源很丰富。 首页:鱼C工作室-免费编程视频教学|Python教学|Web开发教学|全栈开发教学|C语言教学|汇编教学|Win32开发…

诉诸存储和传输的编码

用脑补而不是重传对有损传输进行纠错 后&#xff0c;有朋友评论&#xff1a; 可现代的图像压缩、数据编码已经很大程度上把可以脑补的空间从传输载荷中沥干了——完美编码下所传输的数据是近乎噪声的没有任何特点的分布。在这个框架下&#xff0c;被压缩的载荷如果随便丢了一点…

Linux------进程地址空间

目录 一、进程地址空间 二、地址空间本质 三、什么是区域划分 四、为什么要有地址空间 1.让进程以统一的视角看到内存 2.进程访问内存的安全检查 3.将进程管理与内存管理进行解耦 一、进程地址空间 在我们学习C/C的时候&#xff0c;一定经常听到数据存放在堆区、栈区、…

4、正则表达式、本地存储

一、正则表达式 1、定义 用事先定义好的一些特定字符&#xff0c;这样的字符组合&#xff0c;组合成一个“规则字符串” 2、正则的组成 特殊字符 字母、数字、下划线、中文、特殊字符… 元字符&#xff08;常用&#xff09; 1、\d 匹配至少有一个数字 var reg /\d/ /…

2024Java面试题一

目录 问题&#xff1a; 答案&#xff1a; 问题&#xff1a; 什么是Java中的多态性&#xff08;Polymorphism&#xff09;&#xff1f;Java中的重载&#xff08;Overloading&#xff09;和重写&#xff08;Overriding&#xff09;有什么区别&#xff1f;什么是Java中的抽象类&…

XGB-13:使用 XGBoost 外部内存版本

在处理大型数据集时&#xff0c;训练 XGBoost 模型可能会面临挑战&#xff0c;因为整个数据集需要加载到内存中。这可能成本高昂&#xff0c;有时也难以实现。从版本 1.5 开始&#xff0c;用户可以定义自定义迭代器以按块加载数据来运行 XGBoost 算法。外部内存可以用于训练和预…

每日一题Acwing-借教室

503. 借教室 - AcWing题库 想到了差分没想到二分法。同时注意INT的范围是10位。 #include<iostream> using namespace std; int n,m; const int N 1e610; int r[N],s[N],d[N],t[N]; long long b[N]; bool check(int mid){for(int i1;i<n;i){b[i]r[i]-r[i-1];}for(…

SpringBoot整合rabbitmq-直连交换机队列(二)

说明&#xff1a;本文章主要是Direct定向/直连类型交换机的使用&#xff0c;它的大致流程是将一个队列绑定到一个直连交换机上&#xff0c;并赋予一个路由键 routingkey&#xff0c;当一个消息携带着路由值为routingkey&#xff0c;这个消息通过生产者发送给交换机时&#xff0…