概念
- 一种用来存储唯一值的数据结构,通常以键值对的方式存储。
- es6中拥有字典这个数据结构,叫做map。map(映射)
map常用操作(增删改查)
增加
const m = new Map()
m.set('a','aa')
m.set('b','bb')
//a和aa分别对应k和v,组成一个kv对
查询
m.get('a')
//通过get方法和key来查询key所对应的value
删除
m.delete('a')
// 将key传入delete方法中可删除key所对应的value
m.clear()
// 直接调用clear方法会清空m里的所有值
修改
m.set('a','aaa')
// 再次调用set方法传入你要修改的key和修改后的value,对原来的值进行覆盖
leetcode相关算法题
T349 两个数组的交集
- 给定两个数组,编写一个函数来计算它们的交集。
- 示例 1:
- 输入:nums1 = [1,2,2,1], nums2 = [2,2]
- 输出:[2]
- 示例 2:
- 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
- 输出:[9,4]
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/in… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:遍历第一个数组,然后将遍历到的数组传入新创建的map中,k为这个数,v为true,然后遍历第二个数组,如果将第二个数组中的数调用get方法可以得到值,则证明map中已经有这个数了,将其推入结果数组,然后将这个kv对删除
var intersection = function(nums1, nums2) {
const map = new Map()
nums1.forEach(item => {
map.set(item,true)
})
const res = []
nums2.forEach(item => {
if(map.get(item)){
res.push(item)
map.delete(item)
}
})
return res
};
T20 有效的括号
-
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
-
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
-
-
示例 1:
-
输入:s = "()"
-
输出:true
-
示例 2:
-
输入:s = "()[]{}"
-
输出:true
-
示例 3:
-
输入:s = "(]"
-
输出:false
-
示例 4:
-
输入:s = "([)]"
-
输出:false
-
示例 5:
-
输入:s = "{[]}"
-
输出:true
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
先将所有括号存到map中,左括号为k,右括号为v,结合栈的思想,将所有数据遍历,如果map.get(i)不为flase则证明是左括号,否则就是右括号,然后将栈顶元素调用get方法得到对应的值进行比较,相同则出栈
var isValid = function(s) {
if(s.length % 2 != 0 ){return false}
const stack = []
const map = new Map()
map.set('(',')')
map.set('{','}')
map.set('[',']')
for (let i = 0;i< s.length;i++){
let c = s[i]
if(map.get(c)){
stack.push(c)
}else{
const top = stack[stack.length-1]
if ( map.get(top) === c){
stack.pop()
}else{
return false
}
}
}
return stack.length === 0
};
T1 : 两数之和:
- 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
- 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
- 你可以按任意顺序返回答案。
- 示例 1:
- 输入:nums = [2,7,11,15], target = 9
- 输出:[0,1]
- 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/tw…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:将数和target—i的差保存至map中进行匹配
var twoSum = function(nums, target) {
const map = new Map()
for(let i =0;i<nums.length;i++){
let tar = target - nums[i]
if(map.has(tar)){
return([map.get(tar),i])
}else{
map.set(nums[i],i)
}
}
};
T3 无重复最长字串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:双指针滑动窗口,并记录当前最长字串的length,把遍历到的数据存入map中
var lengthOfLongestSubstring = function(s) {
let l = res = 0
const map = new Map()
for(let r = 0;r<s.length;r++){
if(map.has(s[r]) && map.get(s[r]) >= l){
l = map.get(s[r]) + 1
}
res = Math.max(res,r-l+1)
map.set(s[r],r)
}
return res
};