@TOC
字典是什么?
与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储 ES6中有字典,名为Map 字典的常用操作:键值对的增删改查
const m = new Map();
// 增
m.set('a', 'aa');
m.set('b', 'bb');
// 删
m.delete('b');
// m.clear();
// 改
m.set('a', 'aaa');
//查
m.set('a');
LeetCode:349.两个数组的交集
输入:nums1 = [1,2,2,1],nums = [2,2] 输出:[2]
解题思路
求nums1和nums2都有的值
用字典建立一个映射关系,记录nums1里有的值
遍历nums2,找出nums1里也有的值
解题步骤
新建一个字典,遍历nums1,填充字典
遍历nums2,遇到字典里的值就选出,并从字典中删除
时间复杂度O(m+n),空间复杂度O(m)
LeetCode:20.有效的括号
时间复杂度O(n),空间复杂度O(n)
LeetCode:1.两数之和
给定nums = [2,7,11,15],target = 9 因为nums[0] + nums[1] = 2 + 7 = 9 所以返回[0,1]
解题思路 把nums想象成相亲者 把target想象成匹配条件 用字典建立一个婚姻介绍所,存储相亲者的数字和下标 解题步骤 新建一个字典作为婚姻介绍所 nums里的值,逐个来介绍所找对象,没有合适的就先登记着,有合适的就牵手成功
时间复杂度O(n),空间复杂度O(n),空间复杂度可以做得更好,可以时间换空间
LeetCode:3.无重复字符的最长子串
解题思路
先找出所有的不包含重复字符的子串
找出长度最大那个子串,返回其长度即可
解题步骤
用双指针维护一个滑动窗口,用来剪切子串
不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位
过程中,记录所有窗口的长度,并返回最大值
时间复杂度O(n),空间复杂度:O(m),m是字符串中不重复字符的个数
LeetCode:76.最小覆盖子串
解题思路
先找出所有包含T的子串
找出长度最小那个子串,返回即可
解题步骤
用双指针维护一个滑动窗口
移动右指针,找到包含T的子串,移动左指针,尽量减少包含T的子串的长度
循环上述过程,找出包含T的最小子串
时间复杂度:O(m+n),m是t的长度,n是s的长度 空间复杂度:O(m),m是t里不同字符的个数
思考题
1、在你的实际工作中使用字典完成一次映射操作 2、请用 Chrome 的 Profile 工具或其他任意前端性能测试工具,测试 Map 和 Object 频繁增删操作的性能,谁高谁低?