一、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. 四数之和相关推荐

  1. 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

    代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...

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

    一.Leetcode 454. 四数相加 II 相当于两数相加.但是呢很巧妙的是,卡哥在遍历CD数组时把查哈希表的方法融入了进去.学习一下. 二.Leetcode 383. 赎金信 更简单了,主要是审 ...

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

    今日学习的文章和视频链接 454文章链接: link 454视频讲解链接: link 383文章链接: link 383视频暂无讲解 15文章链接: link 15视频讲解链接: link 18文章链 ...

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

    454. 四数相加 II 题解及想法 通过两个for循环先遍历a和b,key放a和b两数之和,value 放a和b两数之和出现的次数,再通过两个for循环遍历c和d,如果0-(c+d) 在map中出现 ...

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

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

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

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

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

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

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

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

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

    一.参考资料 四数相加II 题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II. ...

最新文章

  1. apkplug利用plugin.xml传递自定义属性
  2. 文献记录(part11)--Biclustering of Expression Data
  3. 求1~100以内的素数,最简单的方式
  4. Fortran与C/C++混合编程示例
  5. GWR4 软件输入数据制作
  6. 【Unity】文字游戏制作插件Fungus教程(1)基础的使用方法
  7. solidity教程:solidity语言入门
  8. 令牌环访问控制的原理_通过Keycloak进行访问控制的级别,第1部分:令牌认证
  9. 计算机桌面文件夹不显示不出来的,如何隐藏文件夹别人都看不到
  10. 服务器CPU和普通CPU的区别
  11. 企业官方微博的视觉设计与营销策略分析
  12. php insertrow,table insertRow、deleteRow定义和用法总结_javascript技巧
  13. 通过ffmpeg把图片转换成视频
  14. u盘里的文件不见了怎么恢复正常?
  15. 2016.06工作日志
  16. 地球物理勘探技术类毕业论文文献有哪些?
  17. 学院官网项目三级页面总结
  18. [自考总结]想要去的远方,终有一天会到达
  19. Oracle 的汉译名 甲骨文 由来
  20. WPF真入门教程22--样式应用

热门文章

  1. XMOS 开发探索2-麦克风拾音
  2. zootracer使用说明——一款视频物体追踪软件,获取运动物体在屏幕坐标系的运动轨迹
  3. 领域驱动设计战术模式:实体
  4. 数据库有哪几种结构?
  5. MySQL:开窗函数
  6. php 二维数组中去重,[转]PHP二维数组去重数组去重
  7. 马尔可夫决策过程的一些个人理解
  8. 报错解决:[nodemon] app crashed - waiting for file changes before starting...
  9. 基于JS和vue的sql编辑器功能的实现
  10. Aruba无线网络学习(一)