(七)数据结构之“字典”

93 阅读2分钟

@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 频繁增删操作的性能,谁高谁低?