今天咱来整哈希表
1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
暴力解法是啥我也忘了
下面来说一下哈希表的解法
这里就不得不提一句Map(map构造函数的用法)
1.首先创建一个map构造函数,for进行循环
2.在map里寻找是否存在target - nums[i]
3.如果不存在,那么就放进map中,key为值,value为该值的位置
4.如果存在,那么就直接把nums[i]
的位置和target-nums[i]
的位置作为数组返回就可以了
下面是代码👇
var twoSum = function(nums, target) {
let hashMap = new Map()
for(i = 0; i < nums.length; i++){
let abstract = target - nums[i]
if(hashMap.has(abstract)) return [i, hashMap.get(abstract)]
hashMap.set(nums[i], i)
}
};
49.字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词指字母相同,但排列不同的字符串
- 示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]- 示例 2:
输入: strs = [""]
输出: [[""]]- 示例 3:
输入: strs = [“a”]
输出: [[“a”]]
这个就不存在暴力解法了,不过我想到一个哈希表的解法
1.创建Map构造函数,进行for循环
2.每次循环中的字符串都可以在内部进行重新排序,按a-z的顺序排
3.在map里寻找是否存在按a-z排序的字符串
4.如果不存在,那么就存入map,key值为该顺序排序的字符串,value为改字符串在输出数组中的index值,从0开始
5.如果存在的话,那么就把未经排序的该字符串放入从map中取的value(也就是index)中
如下👇
var groupAnagrams = function (strs) {
let arr = []
let str = ''
let hashMap = new Map()
let count = 0
strs.forEach(item => {
str = item.split('').sort().join('')
if (hashMap.has(str)) {
let outIndex = hashMap.get(str)
let arr1 = arr[outIndex]
arr1.push(item)
arr.splice(outIndex, 1, arr1)
} else {
hashMap.set(str, count)
arr.push([item])
count++
}
})
return arr
};