Leetcode 454.四数相加II
思路分析:
本题直观的想法是采取暴力法,四数相加就用四层for循环。虽然能得到结果,但时间复杂度为o(n4),当数组长度较大时,Leetcode便提示超时。该方法并不可取。
参考《代码随想录》,可以对四个数组分组,num1和num2为一组,先统计这两个数组中各元素的和出现的次数,用unordered_map存储,然后统计num3和num4为一组元素之和的负数在unordered_map出现的次数,该次数相加,即为四数相加和为0的次数。
代码实现:
方法1:暴力法(Leetcode会超时)

class Solution {public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {int count = 0;for (int i=0;i<nums1.size();i++) {for (int j=0;j<nums2.size();j++) {for (int k=0;k<nums3.size();k++) {for (int l=0;l<nums4.size();l++) {if (nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0) {count++;}}}}}return count;}
};

方法2:使用unordered_map

class Solution {public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> u_map;int count = 0;for (int a:nums1) {for (int b:nums2) {u_map[a+b]++;}}for (int c:nums3) {for (int d:nums4) {if (u_map.count(0-(c+d))) {count+=u_map[0-(c+d)];}}}return count;}
};

Leetcode 383. 赎金信
思路分析:
直观的思路是用unordered_map统计ransomNote和magazine中各个字符出现的次数,然后看ransomNote中每个字符出现的次数是否都不大于该字符在magazine出现的次数。见方法1。
类似242.有效的字母异位词,实现数组来记录每个字符出现的次数更简洁,见方法2。
代码实现:
方法1:

class Solution {public:bool canConstruct(string ransomNote, string magazine) {unordered_map<char,int> magazine_u_map;unordered_map<char,int> ransomNote_u_map;int count = 0;for (auto ch:magazine) {magazine_u_map[ch]++;}for (auto ch:ransomNote) {ransomNote_u_map[ch]++;}for (auto ch:ransomNote) {if (ransomNote_u_map[ch] <= magazine_u_map[ch]) {count++;}}if (count == ransomNote.size()) {return true;} else {return false;}}
};

方法2:

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

Leetcode 15. 三数之和
思路分析:
本题的难点是不重复的三元组,需要做去重处理。以下是参考《代码随想录》写的,个人在去重这块没处理好。

代码实现:
方法:双指针法

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;}if (i > 0 && nums[i] == nums[i-1]) {continue;}int left = i+1, right = nums.size()-1;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;}
};

Leetcode 18. 四数之和
思路分析:
四数之和和三数之和类似,可使用双指针法和两层for循环。难点是不重复的三元组,需要做去重处理。去重处理本人参考了《代码随想录》。另外考虑到数据会越过int的边界,可用long强制类型转换。

代码实现:

class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;sort(nums.begin(), nums.end());for (int i=0;i<nums.size();i++) {if (nums[i] > target && nums[i] >= 0) {return result;}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, right=nums.size()-1;while (left < right) {if ((long)nums[i] + nums[j] + nums[left] + nums[right] > target) {right--;} else if ((long)nums[i] + nums[j] + nums[left] + nums[right] < target) {left++;} else {result.push_back(vector<int>{nums[i], nums[j], nums[left], nums[right]});while (left<right && nums[right]==nums[right-1]) {right--;}while (left<right && nums[left]==nums[left+1]) {left++;}left++;right--;}}}}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. 代码随想录算法训练营第七天|454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

    今日学习的文章和视频链接 454文章链接: link 454视频讲解链接: link 383文章链接: link 383视频暂无讲解 15文章链接: link 15视频讲解链接: link 18文章链 ...

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

    454. 四数相加 II 题解及想法 通过两个for循环先遍历a和b,key放a和b两数之和,value 放a和b两数之和出现的次数,再通过两个for循环遍历c和d,如果0-(c+d) 在map中出现 ...

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

    454.四数相加Ⅱ.383.赎金信.15.三数之和四数之和 四数相加 对于四数相加,我们可以定义一个map用来记录nums1与nums2的和对应次数,再遍历nums3与nums4,如果存在c与d使得a ...

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

    454.四数相加II 题目链接 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i ...

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

    454. 四数相加 II 题目: 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= ...

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

    一.参考资料 四数相加II 题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II. ...

最新文章

  1. centos下设置node.js开机启动(并且启动自己的项目js)
  2. 利用Scala特征(trait)的堆叠操作特性进行切面编程
  3. airpods2使用_如何使用AirPods和AirPods Pro:完整指南
  4. AtCoder Regular Contest 065
  5. 下载开发证书步骤(自用备忘)
  6. 好的PHP库离不开一个好的命名空间
  7. opencv空间色彩转换
  8. python实验结论怎么写_Python实验课:Python元组数据及其运算
  9. 微信小程序获取二维码中URL中带的参数
  10. docker 容器 exited_docker常用命令整理
  11. criteria函数_1.2.21 EXCEL篇之函数篇-数学与三角函数1
  12. 0302 GDB调试走起【给PHP写插件】
  13. 分享一个Bing的翻译功能
  14. 批发网商品采集API接口
  15. excel怎么设置自动计算_机械设计工程师辅助计算Excel表格,自动进行选型计算...
  16. 共享WiFi码项目一天赚3000,一个月6W,背后逻辑与源代码分析
  17. 黑晓军 华中科技大学 博士 副教授
  18. 【DP + 思维】A Question of Ingestion Gym - 101673G
  19. 祝萍:后疫情时代,医美运营既要走心也要反套路
  20. 英语 词根 词缀 查询网址

热门文章

  1. 用AI人工智能技术修复老照片
  2. 让Windows加倍好看
  3. mycat学习笔记3:分库分表
  4. 我的世界服务器自动掉tps,我的世界服务器无限崩溃重启
  5. vue如何优雅的上传文件
  6. GRP-U8G版重新安装客户端
  7. Tokitsukaze and a+b=n (medium)
  8. 创建springboot项目关于applica.properties文件配置
  9. 径向基函数RBF神经网络相关函数设置
  10. Android版本和API level