训练营哈希表专题

LeetCode242.有效的字母异位词

思路:

首先是题目,说人话就是两个字符串里面包含的字母以及数量是否相等

用数组,每个字母对应一个下标,因为char类型字母ascall码是有序的,对每个字母进行-'a'的操作即可形成一个26个元素大小且0-25从'a'-'z'一一对应的数组。即数组保存的是每个字母的数量

对第一个字符串去统计每个字母出现的次数,对第二个字符串去作类似取出的运算,最后去查看数组中保存的数值是否不等于0,不等于0说明有字母及其数量并不同时存在于两个数组

LeetCode349.两个数组的交集

思路:

用hashset,利用其不存放重复元素的特性以及哈希表的特性,就能做到快速检索了。

具体就是分别遍历两个表,第一个表的数据都存进set,遍历第二个表时就用contains方法去查看是否有相同元素,将符合要求的结果也保存进set,这也是为了去重

LeetCode202.快乐数

思路:

求平方和,将结果保存在set中,每次保存之前检索一下是否已经存在,如果存在,那就说明会无限循环了,那么就可以说明不是快乐数,如果最后结果变为1,那就直接返回true即可。

关键就是理解到题干中无限循环的含义

LeetCode1.两数之和

思路:

遍历数组,将每一个元素保存在hashmap中,key为元素数值,value为元素下标,再求一个rest = target-num[i],看看rest是否存在于map中

出现的问题:

不能出现同一个元素,例如target = 6 ,测试用例[3,3],预期结果应该是[0,1]而不是[0,0]或者[1,1]

LeetCode454.四数相加 II

思路:

把四个数组分成两部分,都用两层for循环去遍历,求和。

第一部分求和,将结果放入map,key就是求和的值,value是这个值出现的次数

第二部分求和,去map中检索结果(用相反数,因为总和要为0),计数的时候如果出现了符合要求的,要直接加value(),因为每次遍历对应的下标不同

LeetCode383.赎金信

思路:

几乎和有效字母异位词一样

LeetCode15.三数之和

思路:(双指针法)

遍历数组(fori),以i的下一个元素为起点作为左指针(left),数组最右边的为右指针(nums.length - 1),求这三个指针的和,每一次遍历,左右指针不断缩小范围(left++ , right--),直到符合加和为0,或者left>right。

去重思路:

首先要对数组进行排序操作,对 i 进行剪枝,nums[i]如果大于0说明接下来的元素也都大于0,可以直接结束循环了。

i 去重:(主要的思路就是反证法)

对 i - 1 的元素和 i 元素判断是否相等,而不是 i+1 , 因为是先去重,如果把当前的作为不满足要求的去掉了,可能就会出现 i 和 i+1符合题目以及另一个right要求,但是被你去掉了。

对right,left去重:

left的下一个元素以及right的前一个元素,去判断是否相等,相等就移动(缩窄),循环的末尾再去移动一次(缩窄指针范围)指针。

LeetCode18.四数之和

思路:

套壳多一层for循环,多做一个剪枝,当然第二层for循环因为前面已经做过剪枝了,就可以不用做

fori,j的去重:

和三数之和几乎一致

遇到的问题:

计算四数之和的sum写在了双指针循环的外面,这显然是不对的,但是自己当时想当然了。因为指针每移动一次,sum都会改变。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值