454.四数相加II

力扣题目链接

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i]+B[j]+C[k]+D[l] = 0。

为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过2^31 - 1。

思路

  • 两层for循环遍历nums1和nums2,并将结果存入map
  • map的key=数值,value=出现的次数
  • 两层for循环遍历nums3和nums4,在map中查询0-nums3-nums4
  • 若找到,统计次数

代码

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> map;int count=0;for(int i=0;i<nums1.size();i++)for(int j=0;j<nums2.size();j++)map[nums1[i]+nums2[j]]++;for(int i=0;i<nums3.size();i++)for(int j=0;j<nums4.size();j++)if(map.find(0-nums3[i]-nums4[j])!=map.end())count+=map[0-nums3[i]-nums4[j]];return count;}
};
  • 时间复杂度O(n^2)
  • 空间复杂度O(n^2)在最坏的情况下,A[i]+B[j]的值均不相同,也就需要 O(n^2)的空间。

383. 赎金信

力扣题目链接

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。

(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)

思路

  • 哈希数组
  • 一个数组存为哈希表,另一个去查询

代码

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int hash[26]={0};for(int i=0;i<ransomNote.size();i++)hash[ransomNote[i]-'a']++;for(int i=0;i<magazine.size();i++)if(hash[magazine[i]-'a']!=0) hash[magazine[i]-'a']--;for(int i=0;i<26;i++)if(hash[i]>0) return false;return true;}
};
class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int hash[26]={0};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;}
};
  • 时间复杂度O(m+n)
  • 空间复杂度O(S)

15. 三数之和

力扣题目链接

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

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

思路

1. 哈希法

  • 排序
  • 两层for循环确定a,b的值,将值存入set中,然后查找0-a-b是否存在于set中
  • a,b,c的去重

2. 排序+双指针

  • 对数组进行排序
  • 下标i表示a,left表示b,right表示c
  • 如果nums[i]>0,返回[]
  • 对a进行去重,然后移动left和right,如果nums[i]+nums[left]+nums[right]==0,则添加到结果中
  • 如果nums[i]+nums[left]+nums[right]>0,right–,并去重
  • 如果nums[i]+nums[left]+nums[right]<0,left++,并去重

关键:去重的逻辑

  1. i的去重:nums[i]==nums[i-1]
  2. leftright的去重:先添加结果,再去重(保证至少存入了一个结果)

代码

1. 哈希法

2. 排序+双指针

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> results;sort(nums.begin(),nums.end());for(int i=0;i<nums.size();i++){if(nums[i]>0) return results;if(i>0&&nums[i]==nums[i-1]) continue;int left=i+1;int right=nums.size()-1;while(left<right){ //不使用left==right:当两者相等时,指向同一位置,表示一个数,矛盾if(nums[i]+nums[left]+nums[right]>0)right--;else if(nums[i]+nums[left]+nums[right]<0)left++;else{results.push_back(vector<int>{nums[i],nums[left],nums[right]});while(left<right&&nums[left]==nums[left+1]) left++;while(left<right&&nums[right]==nums[right-1]) right--;left++;right--;}}}return results;}
};
  • 时间复杂度O(n^2)
  • 空间复杂度O(1ogn)

18. 四数之和

力扣题目链接

题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]

思路

  • 排序+双指针法,与三数之和解法相同
  • 剪枝处理不同:target>=0时,剪枝,否则,不剪枝
  • 一级剪枝+二级剪枝

代码

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> results;sort(nums.begin(),nums.end());for(int i=0;i<nums.size();i++){//剪枝处理if(target>=0&&nums[i]>target) break;if(i>0&&nums[i]==nums[i-1]) continue;for(int j=i+1;j<nums.size();j++){//二级剪枝处理if(target>=0&&nums[i]+nums[j]>target) break;if(j>i+1&&nums[j]==nums[j-1]) continue;int left=j+1;int 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{results.push_back(vector<int>{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--;}}}}return results;}
};
  • 时间复杂度O(n^3)
  • 空间复杂度O(logn)

代码随想录算法训练营第7天|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. 代码随想录算法训练营第07天 | 454.四数相加II 、383. 赎金信、315. 三数之和 、18. 四数之和

    题目 题目链接,代码 题目链接,代码 题目链接,代码 题目链接,代码 初见思路 454.四数相加II 直接看了解析,想通的话还是比较好理解的.用一个map来记录两个数组的和以及出现次数, key为i+ ...

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

    Leetcode 454.四数相加II 思路分析: 本题直观的想法是采取暴力法,四数相加就用四层for循环.虽然能得到结果,但时间复杂度为o(n4),当数组长度较大时,Leetcode便提示超时.该方 ...

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

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

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

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

最新文章

  1. 有没有必要把机器学习算法自己实现一遍?
  2. python做bi系统_如何使用Python创建可视化对象
  3. 2013年F5应用交付高峰论坛北京站落幕
  4. vins中imu融合_基于非线性优化算法—当视觉SLAM遇到VINS会碰撞出怎样的火花?
  5. python的none是什么-Python中的None与Null(空字符)的区别
  6. 设计模式-Observer模式
  7. python双循环zip_Python如何同时进行两个循环
  8. 通信 / HTTPS 过程详解
  9. servlet文件上传及下载
  10. 前端接收pdf文件_雷达接收机的噪声系统及灵敏度
  11. python-pass
  12. C++(STL):03---智能指针之shared_ptr
  13. 聊天室后台 java php_PHP实现简单聊天室(附源码)
  14. pandas计算环比与同比
  15. 风变编程课后习题答案
  16. 计算机上e盘拒绝访问,E盘拒绝访问怎么办?Win7系统E盘拒绝访问的方法
  17. twitter、facebook、pinterest、linkedin 分享代码
  18. win10显示器亮度无法调节
  19. 2021-10-11 今日总结
  20. 文心一言,被网友玩坏了哈哈哈哈哈哈哈

热门文章

  1. 性能优化之通过Aspose组件将Word/Excel/PPT/PDF转成HTML文件,解决大附件预览性能问题
  2. python中进程间通信方式总结
  3. python课程设计小游戏大全_用Python设计一个经典小游戏
  4. 面试高级Java面试题
  5. TypeScript1-TypeScript 简介及环境搭建
  6. Nacos、Eureak、Feign原理源码分析
  7. react native watchman 作用
  8. 英语易混淆词语:四六级,考研均适用(持续更新中~)
  9. 运算放大器实现的施密特触发器
  10. 6大服务网格工具比较