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

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

454.四数相加II

题目链接:454.四数相加II,难度:中等
【实现代码】

class Solution {public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {int n= nums1.size();int result = 0;unordered_map<int, int> m;int sum;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {sum = nums1[i] + nums2[j];m[sum]++;}}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {sum = nums3[i] + nums4[j];if (m.count(0 - sum) == 1) {result += m[0 - sum];}}}return result; }
};

【解题思路】

将四个循环的嵌套,通过空间换时间的方式,把四个嵌套的循环转为两个循环嵌套。
前一个两循环嵌套计算前面两个数组的和,并存入无序map里,map存的是相同和的次数。
后一个两循环嵌套计算后两个数组的和,并查询map的值,加上map的key对应的次数。

【总结】

【收获】四数相加II用哈希。

383. 赎金信

题目链接:383. 赎金信,难度:简单
【实现代码】

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

【解题思路】

看到了小写字母、数组和题意,首先就想到了用数组实现hash。
数组存储后一个字符串的字符,并用前一个字符串进行数组的更新,如果数组对应的元素小于0时,则返回false。

15. 三数之和

题目链接:15. 三数之和,难度:中等
【实现代码】

class Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了if (nums[i] > 0) {return result;}// 错误去重a方法,将会漏掉-1,-1,2 这种情况/*if (nums[i] == nums[i + 1]) {continue;}*/// 正确去重a方法if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组/*while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;*/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]});// 去重逻辑应该放在找到一个三元组之后,对b 和 c去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;// 找到答案时,双指针同时收缩right--;left++;}}}return result;}
};

【解题思路】

参考了力扣的题解,吴彦祖的题解

18. 四数之和

题目链接:18. 四数之和,难度:中等
【实现代码】

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

【解题思路】

参考卡哥和官方的题解。

【总结】

双数之和用哈希,三数之和、四数之和用双指针。四数相加用哈希。

代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和。相关推荐

  1. 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

    代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...

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

    一.454.四数相加II 力扣 思路:第一眼还没反应过来,真是缺练.在四个数组中分别寻找,可以先把前两个数组的和先存入map中,再计算后两个数组元素的和,看一下相反数在map中出现没有,出现过就res ...

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

    一.Leetcode 454. 四数相加 II 相当于两数相加.但是呢很巧妙的是,卡哥在遍历CD数组时把查哈希表的方法融入了进去.学习一下. 二.Leetcode 383. 赎金信 更简单了,主要是审 ...

  4. 代码随想录算法训练营day07| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

    Leetcode 454.四数相加II 题目链接 思路:求四数相加之和,将四数两两相加,判断两两相加的数是否和为0 定义一个map,key放两数之和,value放两数之和出现的次数 两层for循环将前 ...

  5. 代码随想录算法训练营day7| 454.四数相加II,383. 赎金信 ,15. 三数之和,18. 四数之和

    454.四数相加II 454. 四数相加 II 四个数在不同的数组里,不用考虑重复的问题 先计算2个数的和,并且统计和出现的次数,在用目标值减去后面两个数的和,用find查找是否存在减去后的数字. c ...

  6. 代码随想录算法训练营第六天

    两数之和 题目:LeetCode.1 接口:java.util.Map 实现: java.util.HashMap<K, V>:哈希表 java.util.TreeMap<K, V& ...

  7. 代码随想录算法训练营第六天|242. 有效的字母异位词,349. 两个数组的交集,202.快乐数,1. 两数之和

    242. 有效的字母异位词 力扣题目链接 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = ...

  8. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

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

    代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30 454.四数相加II 可以先用2次for循环遍历前两个数组a,b 并存储到map ...

最新文章

  1. 全国计算机等级考试成绩查询陕西,陕西计算机等级考试成绩查询入口
  2. Swagger3.0 天天刷屏,真的香吗?
  3. 生态伙伴 | xiaopiu入驻飞书,助你高效创作,从原型到文档一站搞定!
  4. 【异常】redis.clients.jedis.exceptions.JedisDataException: ERR unknown command ‘PSETEX‘
  5. Windows核心编程 第八章 用户方式中线程的同步(上)
  6. pythonwin32api拖动图标_Python使用win32api,模拟鼠标移动并复制/粘贴到diskfi中
  7. 基于OSSIM的漏洞***测试视频教程
  8. mfc打开一个.txt文件并进行处理_文件处理方法Python
  9. macOS安装docker
  10. 能量收集matlab程序_深港微电子学院汪飞课题组在Sensors and Actuators A: Physical上发表双谐振能量采集器论文...
  11. Parallels Desktop 17 for Mac虚拟机 v17.0.1 (51482)
  12. http://blog.csdn.net/evankaka/article/details/45155047
  13. 面向服务架构(SOA)和企业服务总线(ESB)
  14. (Oracle、SqlServer、Access)数据库开发代码生成工具SharpCode2.0
  15. oracle常用的数据字典
  16. html斜删除线怎么设置,html如何设置加粗、倾斜、下划线、删除线等字体效果
  17. BCH编译码的matlab性能分析
  18. android 触摸屏校准软件,触摸屏软件(eGalaxTouch)下载_触摸屏软件(eGalaxTouch)官方下载-太平洋下载中心...
  19. 时空序列预测之Convolutional LSTM Network
  20. DINO:自监督ViT的新特性

热门文章

  1. 【深度学习】Weight Normalization: 一种简单的加速深度网络训练的重参数方法
  2. lemp(lnmp)web网站搭建
  3. java slider_java slider
  4. TSINGSEE青犀视频云边端架构产品运行后加密机可以断电断网吗?
  5. Redis客户端连接时崩溃
  6. 编程知识汇总--3D模型文件的通用格式:FBX
  7. POI导入和导出Excel总结
  8. spark ml 聚类源码笔记二
  9. 快品牌,大品牌,快手新市井电商2022的重点发展对象
  10. ubuntu18.04系统笔记本电脑合盖后无法唤醒问题解决