LeetCode——哈希表(Java)

哈希表

  • 简介
  • [简单] 242. 有效的字母异位词
  • [简单] 349. 两个数组的交集
  • [简单] 202. 快乐数
  • [简单] 1. 两数之和
  • [中等] 454. 四数相加 II
  • [简单] 383. 赎金信
  • [中等]15. 三数之和

简介

记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路,如果有错误,可以在评论区提醒一下。

什么类型的题应该是用哈希表的思想?
需要快速判断一个元素是否出现集合里时。

[简单] 242. 有效的字母异位词

原题链接

最容易想到的就是开两个 26 大小的数组分别做字符统计,然后比较,稍微简化一些可以在单个数组上做统计比对。
这道题放在哈希表系列之下,我想s.charAt(i) - 'a'就是一种hashFunction(),把每个字符对应到一个数组下标从而进行统计

class Solution {public boolean isAnagram(String s, String t) {int[] count = new int[26];for(int i = 0; i < s.length(); i++){count[s.charAt(i) - 'a']++;}for(int i = 0; i < t.length(); i++){count[t.charAt(i) - 'a']--;}for(int i = 0; i < 26; i++){if(count[i] != 0) return false;}return true;}
}

[简单] 349. 两个数组的交集

原题链接

方法①:使用HashSet 写起来方便,效率比较低

class Solution {public int[] intersection(int[] nums1, int[] nums2)  {HashSet<Integer> set1 = new HashSet<>();HashSet<Integer> set2 = new HashSet<>();for( int i : nums1){set1.add(i);}for( int i : nums2){if(set1.contains(i)){set2.add(i);}}return set2.stream().mapToInt(x -> x).toArray();}
}

方法②:List + 数组遍历

public int[] intersection(int[] nums1, int[] nums2)  {int[] count1 = new int[1001];int[] count2 = new int[1001];List<Integer> ansList = new ArrayList<>();for(int i = 0; i < nums1.length; i++){count1[nums1[i]]++;}for(int i = 0; i < nums2.length; i++){if(count1[nums2[i]] != 0 && count2[nums2[i]] == 0){count2[nums2[i]]++;ansList.add(nums2[i]);}}int ans[] = new int[ansList.size()];int index = 0;for(int i : ansList){ans[index++] = i;}return ans;}

方法①和方法②的效率差距:
在这里插入图片描述

[简单] 202. 快乐数

原题链接

题目中说不是快乐数的情况下,sum会一直循环,也就是当sum重复出现的时候,他就不会是一个快乐数了(这个我感觉题面上给的不是很直接),那么只要对sum出现的情况做统计,就可以判断n是否是快乐数。

方法①:在数组上进行统计,int类型最大值 2147483645 最大的情况下也就是十位数,每一位平方总和不会大于 9 * 9 *10;

class Solution {public boolean isHappy(int n) {int[] count = new int[850];while(n != 1){int sum = 0;while(n > 0){sum += (n % 10) * (n % 10);n = n / 10;}if(count[sum] != 0) return false;count[sum]++;n = sum;}return true;}
}

方法②:利用HashSet做统计,HashSet不会储存重复的元素。

class Solution {public boolean isHappy(int n) {HashSet<Integer> set = new HashSet<>();while(n != 1){int sum = 0;while(n > 0){sum += (n % 10) * (n % 10);n = n / 10;}if(set.contains(sum)) return false;set.add(sum);n = sum;}return true;}
}

[简单] 1. 两数之和

原题链接

题目已经给定了样例情况只会有一对正确答案,所以整体上不需要多少边界判断,也可以自己适当做一些细化的处理。

方法①:最简单的思路就是二重循环遍历判断,时间效率上肯定比较低,时间复杂度O(n^2)

class Solution {public int[] twoSum(int[] nums, int target) {for(int i = 0; i < nums.length - 1; i++){for(int j = i + 1; j < nums.length; j++){if(nums[i] + nums[j] == target){return new int[]{i, j};}}}return new int[]{-1, -1};}
}

方法②:使用HashMap映射,遍历每个元素的时候去map中查找target - nums[i]是否已经在map中,有则返回,否则放入当前元素,继续遍历,时间复杂度O(n)

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<Integer, Integer>();for(int i = 0; i < nums.length; i++){if(map.containsKey(target - nums[i]))return new int[]{map.get(target - nums[i]), i};map.put(nums[i], i);}return new int[]{-1, -1};}
}

方法①和方法②的效率差距:
在这里插入图片描述

[中等] 454. 四数相加 II

原题链接

暴力解法的话,四重循环时间复杂度是O(n^4),这显然不太合适。
跟上面一题思路类似,当考虑nums1[i] + nums2[j]中的i和j是否是一组答案中的一部分时,考虑是否有nums3[i] + nums4[j]是前者的相反数即可。所以只需要对nums1和nums2做二重循环记录所有的相加的结果,再到nums3和nums4中做二重循环,看相反数是否包含在上面的记录中。
使用HashMap时,本题不需要记录下标,所以map中的value可以设置为这一组值出现的次数,(map不记录重复的key)。

public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {HashMap<Integer ,Integer> map = new HashMap<>();int count = 0;for(int i = 0; i < nums1.length; i++){for(int j = 0; j < nums2.length; j++){if(map.containsKey(nums1[i] + nums2[j]))map.put(nums1[i] + nums2[j], map.get(nums1[i] + nums2[j]) + 1);else map.put(nums1[i] + nums2[j], 1);}}for(int i = 0; i < nums3.length; i++) {for (int j = 0; j < nums4.length; j++) {if(map.containsKey(0 - nums3[i] - nums4[j]))count += map.get(0 - nums3[i] - nums4[j]);}}return count;}

[简单] 383. 赎金信

原题链接
思维惯性想到HashMap,因为上面的题写多了,但其实这题简单题直接用数组统计就行了。
代码随想录
在这里插入图片描述

class Solution {public boolean canConstruct(String ransomNote, String magazine) {int[] count = new int[26];for(int i = 0; i < magazine.length(); i++){count[magazine.charAt(i) - 'a']++;}for(int i = 0; i < ransomNote.length(); i++){if(count[ransomNote.charAt(i) - 'a'] == 0){return false;}count[ransomNote.charAt(i) - 'a']--;}return true;}
}

[中等]15. 三数之和

原题链接

代码随想录

这题用哈希表的思想很难去重,不如用双指针法。先对数组进行排序,一轮循环中,给定left = i + 1;right = nums.length - 1;此时,三数之和大于0则right--,三数之和小于0则left++
去重的思路就抓住一个,在三个指针移动的时候跳过后续碰到的相同的数。可以用[-4,-1,-1,-1,0,0,1,1,2,2]手动模拟一下。
注意找到答案的时候也需要移动指针,不能直接退出当前循环,因为有可能有[-1,-4,-3,4,5],[-1,-4,5]找到时,还需要继续去找[-1,-3,4]
在这里插入图片描述

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> answer = new ArrayList<>();Arrays.sort(nums);for(int i = 0; i < nums.length ; i++){if(nums[i] > 0) break;//去重if(i > 0 && nums[i] == nums[i - 1])continue;int left = i + 1;int right = nums.length - 1;while(left < right) {//总和过大,right左移if (nums[i] + nums[left] + nums[right] > 0) {while(left < right && nums[right - 1] == nums[right]) right--;right--;}else if(nums[i] + nums[left] + nums[right] < 0){while(left < right && nums[left + 1] == nums[left]) left++;left ++;}else{answer.add(Arrays.asList(nums[i], nums[left], nums[right]));while(left < right && nums[right - 1] == nums[right]) right--;right--;}}}return answer;}

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

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

相关文章

前端技术知识(含八股)总结 - 持续更新中

前端技术知识&#xff08;含八股&#xff09;总结 - 持续更新中 参考文献1.HTML和CSS1.1 语义化标签1.2 CSS 选择器及优先级 / position 定位 / box-sizing 属性 / transition / 继承属性&#xff08;如字体文字类的属性大部分有继承&#xff09;/ 行内元素和块级元素 / html的…

0基础学习PyFlink——用户自定义函数之UDAF

大纲 UDAF入参并非表中一行&#xff08;Row&#xff09;的集合计算每个人考了几门课计算每门课有几个人考试计算每个人的平均分计算每课的平均分计算每个人的最高分和最低分 入参是表中一行&#xff08;Row&#xff09;的集合计算每个人的最高分、最低分以及所属的课程计算每课…

SpringBoot整合阿里云OSS对象存储

文章目录 1、OSS介绍及开通1.1、阿里云OSS简介1.2、开通OSS 2、创建存储空间bucket及密钥获取2.1、创建存储空间2.2、获取密钥 3、OSS快速入门案例4、在springboot项目中整合4.1、将oss配置放到yml文件中4.2、创建Oss属性类&#xff0c;接收yml文件中的属性4.3、封装文件上传功…

SpringBoot集成xxl-job实现超牛的定时任务

XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 ———官网 开始介绍xxl-job的使用前我们先认识一下它的作者&#xff1a;Xuxueli&#xff08;许雪里 &#…

Linux进程程序替换

一、单进程下的程序替换 使用execl进行程序替换&#xff0c;先执行execl前面的代码&#xff0c;在execl处替换成其它进程的代码和数据继续执行&#xff0c;后面的内容就不执行了&#xff0c;因此只打印before 二、程序替换原理 前面我们fork创建子进程&#xff0c;子进程会继承…

一文弄懂Linux信号机制

目录 1.什么是信号&#xff1f; 2.信号实现原理 ​3.信号生命周期 4.信号分类 5.信号常见概念 6.信号阻塞和信号忽略的区别&#xff1f; 1.什么是信号&#xff1f; Linux信号机制是进程间通信的一种方式&#xff0c;用于在不同进程之间传递信息。它通过向目标进程发送一…

SQL Server Management Studio (SSMS)的安装教程

文章目录 SQL Server Management Studio (SSMS)的安装教程从Microsoft官网下载SQL Server Management Studio安装程序。选中安装程序右键并选择“以管理员的身份运行”选项选择安装目录&#xff0c;单击“安装”按钮开始安装过程安装成功界面安装完成后&#xff0c;您可以启动S…

微信小程序 - 页面继承(非完美解决方案)

微信小程序 - 面页继承&#xff08;非完美解决方案&#xff09; 废话思路首页 indexindex.jsindex.jsonindex.wxml 父页面 page-basepage-base.jspage-base.wxml 子页面 page-apage-a.jspage-a.wxml 子页面 page-bpage-b.jspage-b.wxml 其它app.jsapp.jsonapp.wxss 参考资料 废…

QT通过url下载http地址下的文件(文件夹)

前言 之前只写过通过http协议通信&#xff0c;没有写过下载http地址中的文件或者文件夹&#xff0c;了解一下在QT下如何下载。 其实很简单&#xff0c;同使用协议通信相同的是&#xff0c;创建QNetworkAccessManager和QNetworkRequest&#xff0c;设置QNetworkRequest的url&a…

地球系统模式(CESM)详解

目前通用地球系统模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来&#xff0c;一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…

[ poi-表格导出 ] java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader

解决报错&#xff1a; org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 报错描述&#xff1a; 表格导出本来使用正常&#xff0c;偶然就报了以上错误…

一个方法,教你快速监测蓄电池!

随着电力需求的不断增长和可再生能源的快速发展&#xff0c;蓄电池技术已经成为能源存储领域的重要组成部分。 蓄电池不仅在家庭和工业应用中发挥着重要作用&#xff0c;还在电网稳定性和可持续能源集成方面具有关键地位。然而&#xff0c;蓄电池的有效监控和管理对于确保其可靠…

2011-2021年“第四期”数字普惠金融与上市公司匹配(根据城市匹配)/上市公司数字普惠金融指数匹配数据

2011-2021年“第四期”数字普惠金融与上市公司匹配&#xff08;根据城市匹配&#xff09;/上市公司数字普惠金融指数匹配数据 1、时间&#xff1a;2011-2021年 指标&#xff1a;指标&#xff1a;股票代码、年份、行政区划代码、行业名称、行业代码、所属省份、所属城市、数字…

Android开发知识学习——Kotlin进阶

文章目录 次级构造主构造器init 代码块构造属性data class相等性解构Elvis 操作符when 操作符operatorLambdainfix 函数嵌套函数注解使用处目标函数简化函数参数默认值扩展函数类型内联函数部分禁用用内联具体化的类型参数抽象属性委托属性委托类委托 Kotlin 标准函数课后题 次…

【深度学习】【NLP】如何得到一个分词器,如何训练自定义分词器:从基础到实践

文章目录 什么是分词&#xff1f;分词算法使用Python训练分词器步骤1&#xff1a;选择分词算法步骤2&#xff1a;准备训练语料步骤3&#xff1a;配置分词器参数步骤4&#xff1a;训练分词器步骤5&#xff1a;测试和使用分词器 代码示例&#xff1a;使用SentencePiece训练分词器…

塞尔帕替尼的靶点以及疗效【医游记】

&#xff08;图片来源于网络&#xff09; 塞尔帕替尼&#xff08;Selpercatinib&#xff09;是一种高选择性和抑制活性的小分子RET&#xff08;受体酪氨酸激酶&#xff09;抑制剂。它是全球首个获批的高选择性RET抑制剂&#xff0c;用于治疗RET融合阳性的转移性非小细胞肺癌的…

前端 读取/导入 Excel文档

情况&#xff1a; 需要通过Excel表&#xff0c;将数据导入到数据库&#xff0c;但是后台人员出差了&#xff0c;我又只会PHP&#xff0c;没用过node&#xff0c;所以只能前端导入Excel文件&#xff0c;然后循环调用后台的单条添加接口了。 库&#xff1a; Excel.js&#xff08…

LeetCode 2401.最长优雅子数组 ----双指针+位运算

数据范围1e5 考虑nlog 或者n的解法&#xff0c;考虑双指针 因为这里要求的是一段连续的数组 想起我们的最长不重复连续子序列 然后结合一下位运算就好了 是一道双指针不错的题目 class Solution { public:int longestNiceSubarray(vector<int>& nums) {int n nums…

算法leetcode|86. 分隔链表(rust重拳出击)

文章目录 86. 分隔链表&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 86. 分隔链表&#xff1a; 给你一个链表的头节点 head 和一个特…

mybatis-plus 使用 mybatis-plus-join 增强多表关联查询能力

一、mybatis-plus-join mybatis-plus 原生的能力不支持多表关联&#xff0c;对于这种场景只能通过写SQL进行实现&#xff0c;而mybatis-plus-join 则是建立在 mybatis-plus 基础之上的扩展框架&#xff0c;可以在不影响原有能力之上通过简单的API即可实现多表关联能力而无需编…