代码随想录算法训练营第七天|454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和
一、454.四数相加II
力扣
思路:第一眼还没反应过来,真是缺练。在四个数组中分别寻找,可以先把前两个数组的和先存入map中,再计算后两个数组元素的和,看一下相反数在map中出现没有,出现过就res加上这个相反数的个数。
class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {HashMap<Integer, Integer> map = new HashMap<>();int temp;int result = 0;for (int i : nums1) {for (int j : nums2) {temp = i + j;if (map.containsKey(temp)) {map.put(temp, map.get(temp) + 1);}else {map.put(temp, 1);}}}for (int i : nums3) {for (int j : nums4) {temp = i + j;if (map.containsKey(0 - temp)) {result += map.get(0 - temp);}}}return result;}
}
二、赎金信
力扣
思路:和昨天的题目类似,统计字符出现的频率,然后在另一个字符串中判断是否出现过。
class Solution {public boolean canConstruct(String ransomNote, String magazine) {int[] record = new int[26];for (char c : magazine.toCharArray()) {record[c - 'a'] += 1;}for (char c : ransomNote.toCharArray()) {record[c - 'a'] -= 1;if (record[c - 'a'] < 0) {return false;}}return true;}
}
三、三数之和
梦破碎的地方
思路:刚开始还是写不出,然后看了视频讲解,现在对这个题目有进一步的了解。
思考1:两数之和我们直接在map中查找 0 - num[i],这里可不可以进行相同操作?用两个for循环记录前两个数的和,然后在map中寻找?这里涉及到去重,用此种方法很难实现。
思考2:对于遍历数组除了暴力for循环,我们还可以使用双指针来降时间复杂度,这里不需要元素的下标,所以可以将数组排序之后用一个for循环来遍历元素,三元组分别为[i, left, right] ,这里的去重逻辑值得注意,应该是nums[i] == nums[i - 1],而不是nums[i] == nums[i + 1]。去重i,left,和right都得考虑去重
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);int left, right;for (int i = 0; i < nums.length; i++) {// 排序之后如果第一个元素已经大于零,那么不可能凑成三元组if (nums[i] > 0) {return result;}if (i > 0 && nums[i] == nums[i - 1]) {//三元组元素a去重。用了i-1,所以加个条件i>0continue;}left = i + 1;right = nums.length - 1;while (right > left) {//因为是三元组,所以不能left=rightif (nums[i] + nums[left] + nums[right] > 0) {right--;}else if (nums[i] + nums[left] + nums[right] < 0) {left++;}else {result.add(Arrays.asList(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 result;}
}
四、四数之和
四数之和
思路:做会了三数之和,这道题便so easy了,无非一个for循环变成两个for循环,统计前两个数字的和,然后再使用双指针遍历,需要注意的是每个四元组的每个元素都得去重。换成五数之和也可以,换成三个for循环遍历。
class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {// nums[i] > target 直接返回, 剪枝操作if (nums[i] > 0 && nums[i] > target) {return result;}//i去重if (i > 0 && nums[i] == nums[i - 1]) {continue;}for (int j = i + 1; j < nums.length; j++) {//j去重if (j > i + 1 && nums[j] == nums[j - 1]) {continue;}int left = j + 1;int right = nums.length - 1;while (right > left) {if (nums[i] + nums[j] + nums[left] + nums[right] > target) {right--;}else if (nums[i] + nums[j] + nums[left] + nums[right] < target) {left++;}else {result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));while (right > left && nums[right] == nums[right-1]) right--;while (right > left && nums[left] == nums[left+1]) left++;left++;right--;}}}}return result;}
}
代码随想录算法训练营第七天|454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和相关推荐
- 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和
代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...
- 代码随想录算法训练营第6天 | 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和
一.Leetcode 454. 四数相加 II 相当于两数相加.但是呢很巧妙的是,卡哥在遍历CD数组时把查哈希表的方法融入了进去.学习一下. 二.Leetcode 383. 赎金信 更简单了,主要是审 ...
- 代码随想录算法训练营第七天|454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
今日学习的文章和视频链接 454文章链接: link 454视频讲解链接: link 383文章链接: link 383视频暂无讲解 15文章链接: link 15视频讲解链接: link 18文章链 ...
- 代码随想录算法训练营第七天 | 454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和
454. 四数相加 II 题解及想法 通过两个for循环先遍历a和b,key放a和b两数之和,value 放a和b两数之和出现的次数,再通过两个for循环遍历c和d,如果0-(c+d) 在map中出现 ...
- 代码随想录算法训练营第七天| 454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和
Leetcode 454.四数相加II 思路分析: 本题直观的想法是采取暴力法,四数相加就用四层for循环.虽然能得到结果,但时间复杂度为o(n4),当数组长度较大时,Leetcode便提示超时.该方 ...
- 代码随想录算法训练营第七天|454、四数相加Ⅱ 383、赎金信15、三数之和18、四数之和
454.四数相加Ⅱ.383.赎金信.15.三数之和四数之和 四数相加 对于四数相加,我们可以定义一个map用来记录nums1与nums2的和对应次数,再遍历nums3与nums4,如果存在c与d使得a ...
- 代码随想录算法训练营第七天| 454.四数相加II 、383. 赎金信 、15. 三数之和 、18. 四数之和 。
454.四数相加II 题目链接 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i ...
- 代码随想录算法训练营第七天| 454.四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和
454. 四数相加 II 题目: 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= ...
- 代码随想录算法训练营第七天 | 454.四数相加II ,383. 赎金信 ,15. 三数之和,18. 四数之和
一.参考资料 四数相加II 题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II. ...
最新文章
- apkplug利用plugin.xml传递自定义属性
- 文献记录(part11)--Biclustering of Expression Data
- 求1~100以内的素数,最简单的方式
- Fortran与C/C++混合编程示例
- GWR4 软件输入数据制作
- 【Unity】文字游戏制作插件Fungus教程(1)基础的使用方法
- solidity教程:solidity语言入门
- 令牌环访问控制的原理_通过Keycloak进行访问控制的级别,第1部分:令牌认证
- 计算机桌面文件夹不显示不出来的,如何隐藏文件夹别人都看不到
- 服务器CPU和普通CPU的区别
- 企业官方微博的视觉设计与营销策略分析
- php insertrow,table insertRow、deleteRow定义和用法总结_javascript技巧
- 通过ffmpeg把图片转换成视频
- u盘里的文件不见了怎么恢复正常?
- 2016.06工作日志
- 地球物理勘探技术类毕业论文文献有哪些?
- 学院官网项目三级页面总结
- [自考总结]想要去的远方,终有一天会到达
- Oracle 的汉译名 甲骨文 由来
- WPF真入门教程22--样式应用
热门文章
- XMOS 开发探索2-麦克风拾音
- zootracer使用说明——一款视频物体追踪软件,获取运动物体在屏幕坐标系的运动轨迹
- 领域驱动设计战术模式:实体
- 数据库有哪几种结构?
- MySQL:开窗函数
- php 二维数组中去重,[转]PHP二维数组去重数组去重
- 马尔可夫决策过程的一些个人理解
- 报错解决:[nodemon] app crashed - waiting for file changes before starting...
- 基于JS和vue的sql编辑器功能的实现
- Aruba无线网络学习(一)