目录

题目一:四数相加||

题目二:赎金信

题目三:三数之和

题目四:四数之和

总结:


题目一:四数相加||

力扣题目链接

题目描述:

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

0 <= i, j, k, l < n
        nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

思路分析: hashMap解题,分成两组取和存入map中,若相加为0,即可求得元组。视频指路

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {// 使用分而治之的思想,四个数组的和,调整为两个数组相加,另外两个数组相加的形式// 在第一个数组中统计相加的结果以及相加的结果出现的次数// 另一个数组中统计相加的结果以及结果出现的次数,不同的是需要在HashMap 中寻找是否存在满足 map.get(0 - temp) 因为 a + b = 0; b = 0 - a;Map<Integer, Integer> map = new HashMap<>();int count = 0;for (int i : nums1) {for(int j : nums2) {int temp = i + j;if (map.containsKey(temp)) {map.put(temp, map.get(temp) + 1); // 相加结果重复时,将temp对应的value加1} else {map.put(temp, 1); // 相加结果不重复时,temp对应的value值为1}}}for (int i : nums3) {for (int j : nums4) {int temp = i + j;if (map.containsKey(0 - temp)) {count += map.get(0 - temp); // 已存入数据的map中对应value值有多少个,即为最终元组的数量}}}return count;}
}

 题目二:赎金信

力扣题目链接

题目描述:

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

思路分析:和之前的 有效的字母异位词 一样,创建一个长度为26的数组,采用哈希法解题

class Solution {public boolean isAnagram(String s, String t) {int[] record = new int[26];for (char c : s.toCharArray()) {record[c - 'a']++; // 减去'a'对应的ASCLL值,使之对应record的下标}for (char c : t.toCharArray()) {record[c - 'a']--;}for (int count : record) { // 遍历数组if (count != 0) {return false;}}return true;}
}

题目三:三数之和 

力扣题目链接

题目描述:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。

请你返回所有和为 0 且不重复的三元组。

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

思路分析:采用 双指针解题,但要注意剪枝和去重的操作细节。去重逻辑

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>(); // 定义二维数组,存放结果集Arrays.sort(nums); // 排序,方便使用双指针for (int i = 0; i < nums.length; i++) {if (nums[i] > 0) { // 若nums[i]大于0,则可以跳出循环,返回结果break; // 剪枝}if (i > 0 && nums[i] == nums[i - 1]) { // i判断去重continue; // 跳过当前结果集}int left = i + 1;int right = nums.length - 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.add(Arrays.asList(nums[i], nums[left], nums[right]));while (left < right && nums[right] == nums[right - 1]) right--; // right判断去重while (left < right && nums[left] == nums[left + 1]) left++; // left判断去重// 找到结果集后,继续移动指针right--;left++;}}}return result;}
}

题目四:四数之和 

力扣题目链接

题目描述:

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案

思路分析:在三数之和的代码逻辑上再加一层for循环

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> result = new ArrayList<>(); // 定义二维数组,存放结果集int len = nums.length;if (nums == null || len < 4) {return result;}Arrays.sort(nums);for (int i = 0; i < len; i++) {if (nums[i] > 0 && nums[i] > target) { // nums[i] > target 直接返回, 剪枝操作break;}if (i > 0 && nums[i] == nums[i - 1]) { // i判断去重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 = len - 1;while (right > left) {long sums = (long) nums[i] + nums[j] + nums[left] + nums[right];if (sums > target) {right--;} else if (sums < target) {left++;} else {result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));while (left < right && nums[right] == nums[right - 1]) right--; // right判断去重while (left < right && nums[left] == nums[left + 1]) left++; // left判断去重// 找到结果集后,继续移动指针right--;left++;}}}}return result;}
}

 总结:

题目一、二:均采用哈希法解题。

题目三、四:解法类似,双指针解题,但需要注意剪枝和去重的操作。

代码随想录训练营day7相关推荐

  1. 【代码随想录训练营】Day43-动态规划

    代码随想录训练营 Day43 今日任务 1049.最后一块石头的重量Ⅱ 494.目标和 474.一和零 语言:Java 1049. 最后一块石头的重量Ⅱ 链接:https://leetcode.cn/ ...

  2. 代码随想录训练营day8

    目录 题目一:反转字符串 解法一:数值交换 解法二:位运算 题目二:反转字符串|| 题目三:替换空格 解法一:双指针 解法二:使用额外空间 题目四:翻转字符串里的单词 解法一: 解法二:纯属娱乐 题目 ...

  3. 【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代

    理论基础 二叉树的定义形式有:节点指针和数组 在数组中,父节点的下标为i,那么其左孩子的下标即i*2+1,右孩子的下标即为i*2+2 二叉树的常见遍历形式有:前序遍历.后序遍历.中序遍历和层序遍历 前 ...

  4. 代码随想录训练营day56

    题目一:两个字符串的删除操作 力扣题目链接 题目描述: 给定两个单词 word1 和 word2 ,返回使得 word1 和  word2 相同所需的最小步数. 每步 可以删除任意一个字符串中的一个字 ...

  5. 代码随想录训练营day57

    题目一:回文子串 力扣题目链接 题目描述: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一 ...

  6. 代码随想录训练营day53

    题目一:最长公共子序列 力扣题目链接 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . 一个字符串的 子序列  ...

  7. 代码随想录训练营day55

    题目一:判断子序列 力扣题目链接 题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符 ...

  8. 代码随想录训练营day52

    题目一:最长上升子序列 力扣题目链接 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序. ...

  9. 代码随想录训练营day48

    题目一:打家劫舍 力扣题目链接 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上 ...

最新文章

  1. 【干货】产品经理必知的11个微信接口
  2. [ES6] 细化ES6之 -- Promise对象
  3. python调用jar包的模块_使用 Python 的 JPype 模块调用 Jar 包
  4. 转帖一篇关于DELPHI调试的文章-AQTime
  5. stm32 外部8M晶振 改为12M的方法
  6. JavaScript 启动性能瓶颈分析与解决方案
  7. Atiitt 技术部的基本发展战略 attilax总结 艾龙 著 1. 战略的解释,即是 大概纲领与方法 1 2. 技术的基本战略是,培训,吸收与改造,recos,预研,技术储备 1 2.1.
  8. chrome插件Adblock Plus拓展程序
  9. 机器学习项目实战(一) 鸢尾花
  10. win7系统之家特别版下载
  11. python统计大写字符个数和小写英文字符_统计一个字符串中大写字母字符和小写字母字符,数字字符出现的次数...
  12. 浅谈高速公路服务区分布式光伏并网发电
  13. 微信文章临时链接变永久链接
  14. 【数据库】聊一下数据库的锁机制
  15. java版,实现人民币的大小写转换
  16. ZZULIOJ 1000~1009(oj入门题)
  17. 『正睿OI 2019SC Day3』
  18. Asan基本原理及试用
  19. 企业怎么选择低代码/无代码?J2PaaS云开发平台将为市场提供新参考!
  20. 秒杀系统(SecKillGoods)

热门文章

  1. Python 进阶视频课 - 10. LSMC 美式百慕大期权定价
  2. Android中APK安装流程解析
  3. IOS 中视频和音乐合成
  4. 抖音直播行为规范考试
  5. 自动获取verycd feed中的下载链接
  6. 【朝花夕拾】Android自定义View篇之(一)View绘制流程
  7. 织梦cms模板下载:广告品牌设计网站织梦模板
  8. 苹果手机 不要删除服务器邮件,iCloud邮件无法删除怎么办?解决iCloud邮件占用空间方法...
  9. 毕业设计房屋出租研究现状
  10. 哪些情况可以判定需要进行仪器校准?