【代码随想录算法训练营-第七天】【哈希表】454,383,15,18

454. 四数相加 II

第一遍

  • 思路
    • 想不出来,除了暴力解法,完全想不出来其他解法,看答案思路了…
    • 学习了两个新的方法:
      • getOrDefault:返回指定键对应的值,如果不存在,则返回默认值
      • containsKey:判断是否包含key
class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int count = 0;Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums1.length; i++) {for (int j = 0; j < nums2.length; j++) {int sum = nums1[i] + nums2[j];map.put(sum, map.getOrDefault(sum, 0) + 1);}}for (int k = 0; k < nums3.length; k++) {for (int l = 0; l < nums4.length; l++) {int judge_num = -(nums3[k] + nums4[l]);if (map.containsKey(judge_num)) {count += map.get(judge_num);}}}return count;}
}

383. 赎金信

第一遍

  • 思路
    • 这题想出来了,用了15mins,思考+做题;
    • 做完之后看了一下给的题解范例,使用了数组+字符的ascii码只有0-26;
    • 巧妙的利用了字符串ascii码;
    • 同时,因为利用了数组,数据结构更加简单,用时大幅减少;在这里插入图片描述
class Solution {public boolean canConstruct(String ransomNote, String magazine) {Map<String, Integer> map = new HashMap<>();for (int i = 0; i < magazine.length(); i++) {String word = String.valueOf(magazine.charAt(i));map.put(word, map.getOrDefault(word, 0) + 1);}for (int i = 0; i < ransomNote.length(); i++) {String word = String.valueOf(ransomNote.charAt(i));if (!map.containsKey(word)) {return false;}if (map.get(word) < 1) {return false;}map.put(word, map.getOrDefault(word, 0) - 1);}return true;}
}
// 代码随想录提供的题解
class Solution {public boolean canConstruct(String ransomNote, String magazine) {if (ransomNote.length() > magazine.length()) {return false;}int[] judge = new int[26];for (char word : magazine.toCharArray()) {judge[word - 'a'] += 1;}for (char c : ransomNote.toCharArray()) {judge[c - 'a'] -= 1;}for (int i : judge) {if (i <= 0) {return false;}}return true;}
}

15. 三数之和

第一遍

  • 思路
    • 确实没想出来,先记录一下思路,回头看看能不能写出来;
    • 双指针,重点是固定和如何判定去重:
      • 如何判定去重:在移动指针的过程中,如果出现了和为0,则判断左指针的下一个/右指针的前一个,是否是相同数值的元素,如果是的话,left++ or right--
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) { return result;}if (i > 0 && nums[i] == nums[i - 1]) {  continue;}int left = i + 1;int right = nums.length - 1;while (right > left) {int sum = nums[i] + nums[left] + nums[right];if (sum > 0) {right--;} else if (sum < 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;}
}

18. 四数之和

第一遍

  • 思路
    • 这次忘记计时了;
    • 大概思想和三书之和一样,只不过多处理一层循环而已;
    • 需要注意的地方是,用例里面会有让int溢出的场景,因此要在判断数之和与targe的大小的时候需要注意;
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 - 3; ) {if (i > 0 && nums[i] == nums[i - 1]) {i++;continue;}for (int j = i + 1; j < nums.length - 2; ) {if (j > i + 1 && nums[j] == nums[j - 1]) {j++;continue;}int l = j + 1, r = nums.length - 1;int tmpTarget = target - nums[i];while (l < r) {long threeSum = (long) nums[j] + nums[l] + nums[r];if (threeSum > tmpTarget) {r--;} else if (threeSum < tmpTarget) {l++;} else {result.add(Arrays.asList(nums[i], nums[j], nums[l], nums[r]));while (r > l && nums[l] == nums[l + 1]) l++;while (r > l && nums[r] == nums[r - 1]) r--;l++;r--;}}j++;}i++;}return result;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/342151.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干货|Google ads谷歌广告投放详细步骤与技巧

对于跨境电商、独立站运营的卖家来说&#xff0c;谷歌广告投放是必备的流量拓展来源&#xff0c;但是在投入运营之前&#xff0c;你需要完整了解谷歌广告投放详细步骤&#xff0c;以为你丝滑地进行有效投放做好基础&#xff0c;下面为大家整理具体的谷歌投放技巧与步骤&#xf…

uniapp运行自定义底座到真机没反应

同步资源失败&#xff0c;未得到同步资源的授权&#xff0c;请停止运行后重新运行&#xff0c;并注意手机上的授权提示。 如果此时手机没有任何反应&#xff0c;请检查自定义基座是否正确;如果是离线制作的自定义基座包&#xff0c; 请检查离线包制作是否正确。 网上各种查找报…

Unity中URP下实现能量罩(扭曲流光花纹)

文章目录 前言一、能量罩花纹1、在属性面板接收能量罩花纹纹理2、申明 纹理 和 采样器3、在顶点着色器&#xff0c;应用 Tilling 和 Offset4、在片元着色器&#xff0c;纹理采样后&#xff0c;与之前的结果相乘输出 二、能量罩流光1、在顶点着色器&#xff0c;记录原uv值2、在片…

【pytorch】使用pytorch构建线性回归模型-了解计算图和自动梯度

使用pytorch构建线性回归模型 线性方程的一般形式 衡量线性损失的一般形式-均方误差 pytorch中计算图的作用和优势 在 PyTorch 中&#xff0c;计算图&#xff08;Computational Graph&#xff09;是一种用于表示神经网络运算的数据结构。每个节点代表一个操作&#xff0c;例如…

蓝桥杯省赛无忧 STL 课件14 stack

01 stack的定义和结构 stack是一种后进先出&#xff08;LIFO&#xff09;的数据结构&#xff0c;使用前需要包含头文件。 stack提供了一组函数来操作和访问元素&#xff0c;但它的功能相对较简单。 stack的定义和结构如下&#xff08;仅作了解即可&#xff09;&#xff1a; t…

喜讯!云起无垠入选2023年度中国数字安全能力图谱

近日&#xff0c;国内权威的数字化领域第三方服务机构数世咨询发布了“2023年度中国数字安全能力图谱&#xff08;精选版&#xff09;”&#xff0c;该图谱旨在帮助行业用户深入了解当前数字安全产业现状&#xff0c;并为其数字安全能力建设提供有力参考。云起无垠凭借卓越的技…

面试算法116:朋友圈

题目 假设一个班级中有n个学生。学生之间有些是朋友&#xff0c;有些不是。朋友关系是可以传递的。例如&#xff0c;A是B的直接朋友&#xff0c;B是C的直接朋友&#xff0c;那么A是C的间接朋友。定义朋友圈就是一组直接朋友或间接朋友的学生。输入一个nn的矩阵M表示班上的朋友…

直播美颜SDK开发指南:美颜功能设计

直播美颜技术对于提升用户满意度和吸引观众至关重要。本文将深入探讨直播美颜SDK的开发指南&#xff0c;聚焦于美颜功能的设计与实现。 一、美颜功能的重要性 直播美颜功能不仅仅是为了满足用户的虚荣心&#xff0c;更是为了提升用户的自信心和直播质量。一个优秀的美颜功能能…

【linux基础I/O(二)】文件系统讲解以及文件缓冲区的概念

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 基础I/O 1. 前言2. 理解C语言…

【抓包教程】BurpSuite联动雷电模拟器——安卓高版本抓包移动应用教程

前言 近期找到了最适合自己的高版本安卓版本移动应用抓HTTP协议数据包教程&#xff0c;解决了安卓低版本的问题&#xff0c;同时用最简单的办法抓到https的数据包&#xff0c;特此进行文字记录和视频记录。 前期准备 抓包工具&#xff1a;BurpSuite安卓模拟器&#xff1a;雷…

第8章-第2节-Java中IO流的简单介绍

1、什么是流 我们可以先想象水流是怎样的&#xff1f;溪水不断流动&#xff0c;最终融入大海&#xff1b;我们今天的学习IO其实如同水流一样&#xff0c;当我们读取文件信息或者写入信息时&#xff0c;如同水流一样&#xff0c;不断读取或者写入&#xff0c;直到业务流程结束。…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例3-1 CSS3过渡

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>CSS3 过渡</title> <style> /*显示*/ .box {width: 100px;height: 100px;background-color: #eee;/*透明度*/opacity: 1;/*过渡*/transition: 3s; } /…