设计数据结构类的题目,需要从要实现的方法入手,看为了达到这个方法的效果,我们应该需要哪些基础的数据结构作为这个复杂数据结构的属性。同时注意在初始化的时候要给这些属性赋初始值。
例题:LeetCode173. 二叉搜索树迭代器
题目类型总结
-
*284. 顶端迭代器
借助一个变量cur来实现迭代器以前没有的peek功能。 -
**380. O(1) 时间插入、删除和获取随机元素
可以把设计的对象提到方法给他赋值就是全局变量,实现全局各方法操作的是同一个对象的效果。
哈希不能实现随机访问,借助list实现此功能。
难在实现删除O(1), 哈希的值是数值的下标,键是数值。为了实现O(1)删除,将待删除元素与最后一个元素交换,每次都只删最后一个,这样动态数组就不用移动其他元素了。 -
**355. 设计推特
使用全局变量表示twitter的时间先后
使用大顶堆合并多个twitter消息链表
用map集合映射用户与关注的用户
用map集合映射用户与用户发送的twitter
注意很多细节,比如在新加twitter或新关注用户要判空,取消关注也要判集合是否为空 -
AAA6093. 设计一个文本编辑器
用两个栈存储竖线左右两边的字符,删除增加字符都是对左边的栈操作。
技巧总结
数据结构所设计的对象如何实现全局使用?
- 可以创建一个全局变量,这样各个方法操作的是同一个对象。
- 把需要全局适用的目标作为所设计的数据结构的属性,在构造器里面对其初始化,也可以达到全局使用的效果。
不推荐第二种方式,有时候并没有被初始化,目标对象仍然是空。如6066. 统计区间中的整数数目
构造器初始化
构造器初始化,当构造器的形参与属性名称相同时要给属性加上"this."才可以赋值,否则不能赋值!!!就像下面这样,没有给属性正常赋值。例981. 基于时间的键值存储
内部类
内部类可以放置在Solution 类的外面和里面,以及加不加public 都是可以的(在LeetCode上面)。