当前位置: 首页 > news >正文

代码随想录算法训练营20期|第七天|哈希表part02|454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结

454.四数相加II 

比较巧思的解法,先把nums1 和nums2的数两两相加,并存储sum和次数

再在nums3和nums4里找对应和sum和为0的数值i,j

Time: N^2

Space:N^2, 最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {Map<Integer, Integer> map = new HashMap<>();int res = 0;for (int i : nums1) {for (int j : nums2) {int sum = i + j;map.put(sum, map.getOrDefault(sum, 0) + 1);}}for (int i : nums3) {for (int j : nums4) {res += map.getOrDefault(0 - i - j, 0);}}return res;}
}
  •  383. 赎金信 

先遍历长的

class Solution {public boolean canConstruct(String ransomNote, String magazine) {if (ransomNote.length() > magazine.length()) return false;int[] count = new int[26];for (char c : magazine.toCharArray()) {count[c - 'a']++;}for (char c : ransomNote.toCharArray()) {count[c - 'a']--;}for (int n : count) {if (n < 0) return false;}return true;}
}
  •  15. 三数之和 
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {if (nums[i] > 0) return res;if (i > 0 && nums[i] == nums[i - 1]) continue;int left = i + 1;int right = nums.length - 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum < 0) {left++;} else if (sum > 0) {right--;} else {res.add(Arrays.asList(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 res;}
}
  •  18. 四数之和 

在三数之和外面再套一层

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> res = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {if (nums[i] > 0 && nums[i] > target) return res;if (i > 0 && nums[i] == nums[i - 1]) continue;for (int j = i + 1; j < nums.length; j++) {if (j > i + 1 && nums[j] == nums[j - 1]) continue;int left = j + 1;int right = nums.length - 1;while (left < right) {int sum = nums[i] + nums[j] + nums[left] + nums[right];if (sum < target) {left++;} else if (sum > target) {right--;} else {res.add(Arrays.asList(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 res;}
}
  •  总结  
http://www.lryc.cn/news/124587.html

相关文章:

  • NavMeshPlus 2D寻路插件
  • 【03】基础知识:typescript中的函数
  • ssm社区文化宣传网站源码和论文
  • Go语言工程实践之测试与Gin项目实践
  • 排查docker无法启动问题
  • [C++ 网络协议] 套接字和地址族、数据序列
  • AI 绘画Stable Diffusion 研究(八)sd采样方法详解
  • 线程池满了如何处理
  • Java多线程编程中的线程间通信
  • write javaBean error, fastjson version 1.2.76
  • Tomcat的部署及优化(多实例和动静分离)
  • 品牌推广革新之道:海外网红与内容营销的融合
  • 【 BERTopic应用 02/3】 分析卡塔尔世界杯推特数据
  • TypeScript教程(三)变量声明
  • 【数据结构】堆的实现,堆排序以及TOP-K问题
  • 释放马氏距离的力量:用 Python 探索多元数据分析
  • 【不限于联想Y9000P电脑关盖再打开时黑屏的解决办法】
  • 策略模式实战应用
  • JAVA集合-Map
  • 利用Simulink Test进行模型单元测试 - 1
  • 深入探讨代理技术:保障网络安全与高效爬虫
  • HDMI接口的PCB布局布线要求
  • Linux tar包安装 Prometheus 和 Grafana(知识点:systemd Unit/重定向)
  • 【Vue框架】用户和请求
  • NGINX组件(rewrite)
  • 网页显示摄像头数据的方法---基于web video server
  • SIFT 算法 | 如何在 Python 中使用 SIFT 进行图像匹配
  • K8S系列四:服务管理
  • 冠达管理:融券卖出交易规则?
  • 图像变形之移动最小二乘算法(MLS)