今天开始做哈希表了,先要记住使用哈希表的前提是我们需要快速判断一个元素是否出现集合里。
首先看了一下Java里的轮子,也就是HashSet和HashMap。
这两者分别实现了 Set 接口和Map接口,前者具有集合的特性,意思是不能有重复的元素,后者主要是通过键值对实现查找。虽然说底层的实现都是哈希表,但感觉HashMap更符合我对哈希的想象。
然后学习了HashMap和HashSet的基本操作函数,比如put/add,containsKey/contains,get,还有size,remove,clear。
同时注意到HashMap中的元素需要使用包装类。
242.有效的字母异位词
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
这道题其实用数组就可以实现,主要因为字母表个数有限,所以可以用size为26的数组来进行一个哈希表的模拟,只要在相应的桶里面增加个数就好。
在写这道题的时候又发现对一些基本函数不熟练:
字符串长度 s.length()
字符串返回指定索引处的字符 s.charAt(i) 这个有点像把字符串当成数组来处理,感觉很有意思
单引号代表单个字符,而双引号代表一个字符串。
349. 两个数组的交集
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
求交集涉及到集合方面的操作,前提就是它得有集合的性质,所以就用HashSet来做这道题。
我设置了两个HashSet,一个用来存储第一个数组的元素,另一个用来存储交集的元素。首先遍历nums1来获得第一个HashSet,然后遍历nums2,如果第一个HashSet里面有nums2对应的该元素,就证明存在在交集里面,所以再加到交集对应的HashSet里面,最后再把HashSet转换成一个数组并且返回。
这道题里我还用到了for-each,感觉是一个很方便的轮子。
202. 快乐数
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
这道题的关键是理解如果一个数字不是快乐数,它会一直有规律的循环,各位相加永远不会等于1。虽然标粗了,但这个“无限循环”的意义感觉还是不是很好理解。实际操作后发现,加过几次它又会回到最开始的数字,所以会一直循环下去。(有点像那个环形链表)
这就相当于我们需要快速判断一个元素是否出现集合里,所以可以用到HashSet,如果我们在处理新的和的时候,发现在之前已经出现过这个和,就证明陷入了循环,便可以返回false了。当然,如果求出了和等于1,那么就说明可以返回true。
1. 两数之和
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
经典第一题,不好写。。最暴力的方法当然可以用两层for循环解决。但是还是想着找复杂度O(n)的算法。
可以这样思考:对于每个值,所对应的下标是唯一的,这样就形成一个键值对。当我们获得数组中的一个数的时候,我们想要找(target-num)这个值在数组中是否存在,因为(target-num)是已知的,所以这个可以作为Key,那么HashMap中的value就可以是我们期待要找的数组下标。
根据这个思想,我们就可以建立一个HashMap,每次来找key是(target-num)的值存不存在。如果存在,就返回两个数的下标,如果不存在,就将这个数和它的下标存进HashMap中,这样如果存在(target-num)这个数值,它在寻找相应的键值对的时候就可以找到这个元素。
今天的博客好难写。。