代码随想录算法训练营第七天| 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和
1.代码随想录算法训练营第二天| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II2.代码随想录算法训练营第三天| 203. 移除链表元素 707.设计链表 206.反转链表3.代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142. 环形链表 II4.代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。5.代码随想录算法训练营第六天| 242. 有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
6.代码随想录算法训练营第七天| 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和
7.代码随想录算法训练营第九天| 28. 实现 strStr() 和讲讲KMP8.代码随想录算法训练营第十天| 232. 用栈实现队列 225. 用队列实现栈9.代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值10.代码随想录算法训练营第十三天| 239. 滑动窗口最大值 347. 前 K 个高频元素11.代码随想录算法训练营第十四天| 二叉树相关递归遍历以及迭代遍历12.代码随想录算法训练营第十五天| 226. 翻转二叉树 101. 对称二叉树13.代码随想录算法训练营第十六天| 104. 二叉树的最大深度 111. 二叉树的最小深度 222. 完全二叉树的节点个数14.代码随想录算法训练营第十七天| 110. 平衡二叉树 257. 二叉树的所有路径 404. 左叶子之和15.代码随想录算法训练营第十八天| 513. 找树左下角的值 112. 路径总和 113. 路径总和 II 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树16.代码随想录算法训练营第二十一天,二十二,二十三| 530. 二叉搜索树的最小绝对差 501. 二叉搜索树中的众数 236. 二叉树的最近公共祖先 235. 二叉搜索树的最近公共祖先 701. 二叉搜索树中的插入操作 450. 删除二叉搜索树中的节点17.代码随想录算法训练营第二十四天 二十五 | 回溯的理论基础,77. 组合 216. 组合总和 III 17. 电话号码的字母组合18.代码随想录 | 图论 797. 所有可能的路径(dfs) ,200. 岛屿数量 (dfs)200. 岛屿数量 (bfs) ,并查集,1971. 寻找图中是否存在路径454. 四数相加 II
https://leetcode.cn/problems/4sum-ii/description/、
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res = 0;
HashMap<Integer,Integer> map = new HashMap<>();
for (int i : nums1) {
for (int i1 : nums2) {
int sum = i + i1;
map.put(sum,map.getOrDefault(sum,0) + 1);
}
}
for (int i : nums3) {
for (int i1 : nums4) {
int sum = i + i1;
res += map.getOrDefault(-sum,0);
}
}
return res;
}
总结:四个数组的遍历可以划分为两组两个数组的遍历,这种在两组中去遍历一组寻找另一组的模式,就是hash。
383. 赎金信
https://leetcode.cn/problems/ransom-note/description/
HashMap<Character,Integer> map = new HashMap<>();
for (int i = 0; i < magazine.length(); i++) {
map.put(magazine.charAt(i),map.getOrDefault(magazine.charAt(i),0) + 1);
}
for (int i = 0; i < ransomNote.length(); i++) {
if (map.containsKey(ransomNote.charAt(i)) && map.get(ransomNote.charAt(i)) != 0){
map.put(ransomNote.charAt(i),map.get(ransomNote.charAt(i)) - 1);
}else {
return false;
}
}
return true;
总结:map的key存字符,value存出现的次数,再去遍历。
15. 三数之和
https://leetcode.cn/problems/3sum/description/
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> resList = new ArrayList<>();
for (int k = 0; k < nums.length - 2; k++) {
if (nums[k] > 0) break;
if (k > 0 && nums[k] == nums[k - 1]) continue;
int i = k + 1;
int j = nums.length - 1;
while (i < j){
int sum = nums[i] + nums[j] + nums[k];
if (sum == 0){
resList.add(new ArrayList<>(Arrays.asList(nums[k],nums[i],nums[j])));
do {
j--;
}while (i < j && nums[j] == nums[j + 1]);
do {
i++;
}while (i < j && nums[i] == nums[i - 1]);
}else if (sum > 0){
do {
j--;
}while (i < j && nums[j] == nums[j + 1]);
}else {
do {
i++;
}while (i < j && nums[i] == nums[i - 1]);
}
}
}
return resList;
}
总结:这道题我昨天做了,但还是很费劲,主要就在于排序之后 k遍历到>0时 就不需要遍历了 写个判断能省很多时间,而且K也需要每次走到不一样的值才行。 总之就是菜就多练 !
18. 四数之和
https://leetcode.cn/problems/4sum/description/
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> resList = new ArrayList<>();
for (int i = 0; i < nums.length - 3; i++) {
if (nums[i] > 0 && nums[i] > target) return resList;
if (i > 0 && nums[i] == nums[i-1]) continue;
for (int j = i + 1; j < nums.length - 2; j++) {
if (j > i + 1 && nums[j] == nums[j-1]) continue;
int left = j + 1;
int right = nums.length - 1;
while (left < right){
long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
if (sum > target){
do {
right--;
}while (left < right && nums[right] == nums[right + 1]);
}else if (sum < target){
do {
left++;
}while (left < right && nums[left] == nums[left - 1]);
}else {
resList.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
do {
right--;
}while (left < right && nums[right] == nums[right + 1]);
do {
left++;
}while (left < right && nums[left] == nums[left - 1]);
}
}
}
}
return resList;
总结:四数之和就是三数之和的思路,外面再套一层for循环。留意target为负数的情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?