Press "Enter" to skip to content

Huahua's Tech Road

花花酱 LeetCode 2296 Design a Text Editor

方法1:双向链表来存储文本,迭代器指向光标所在的位置。加一个dummy head会使代码简单很多。

时间复杂度:TextEditor O(1) addText O(|text|) deleteText O(k) cursorLeft O(k) cursorRight(k)
空间复杂度:O(n)

由于每个字符需要创建一个节点(17+个字节),虽然没有超时,但实际工程中是不能使用这种方式的。

方法2: 用两个string来代表光标左边的字符串和光标右边的字符串。注:右边字符串是反转的。

左右两边的字符串只会增长(或者覆盖),不会缩短,这是用空间换时间。

删除的时候就是修改了长度而已,并没有缩短字符串,所以是O(1)的。
如果缩短的话需则要O(k)时间,还要加上内存释放/再分配的时间,应该会慢一些但不多。

移动光标的时候,就是把左边字符串的最后k个copy到右边的最后面,或者反过来。同样没有缩短,只会变长。

时间复杂度: TextEditor O(1) addText O(|text|) deleteText O(1) cursorLeft O(k) cursorRight(k)
空间复杂度:O(n),n为构建的最长的字符串

花花酱 LeetCode 3498 Reverse Degree of a String

送分题,简单仿真即可。

时间复杂度:O(n)
空间复杂度:O(1)

花花酱 LeetCode 2349. Design a Number Container System

两个hashtable,一个是index->number,另外一个是number -> {index},使用treeset,自动排序。

时间复杂度:change O(logn),find O(1)
空间复杂度:O(n)

花花酱 LeetCode 2353. Design a Food Rating System

Hashtable + TreeSet / OrderedSet

用了三个Hashtable…

  1. 菜名 -> 菜系
  2. 菜系 -> Treemap
  3. 菜名 -> 所在Treemap中的迭代器

每个菜系用一个TreeSet来保存从高到低的菜色排名,查询的时候只要拿出第一个就好了。

修改的时候,拿出迭代器,删除原来的评分,再把新的评分加入(别忘了更新迭代器)

时间复杂度:构造O(nlogn),修改O(logn),查询O(1)

空间复杂度:O(n)

花花酱 LeetCode 3242. Design Neighbor Sum Service

青铜 Brute Force:每次需要花费O(n*n)的时间去查找query所在的格子,求和是O(1)。总的时间复杂度达到O(n^4),肯定会超时。

白银 Hashtable:由于所有元素的值的唯一的,我们可以使用hashtable(或者数组)来记录value所在的格子坐标,这样每次Query都是O(1)时间。
时间复杂度:初始化O(n^2),query O(1)。
空间复杂度:O(n^2)

黄金 Precompute:在初始化的时候顺便求合,开两个数组一个存上下左右的,一个存对角线的。query的时候直接返回答案就可以了。
时间复杂度和白银是一样的,但会快一些(省去了求合的过程)。