O(n) time O(26) space
是159. Longest Substring with At Most Two Distinct Characters
的follow-up
1 | class Solution { |
lee的做法
1 | class Solution { |
O(n) time O(26) space
是159. Longest Substring with At Most Two Distinct Characters
的follow-up
1 | class Solution { |
lee的做法
1 | class Solution { |
O(logn) time O(n) space
[1, 3]是频数,即构造成下标数组[0, 1, 1, 1]然后随机一个index
累加频数,构造频数和数组[1, 4],这里最后一个4是所有频数的和,即数组[0, 1, 1, 1]的长度,随机以后得到一个下标,需要得到下标所对应的原数组的index,因为频数和数组是递增的,所以二分可得到对应的频数和位置,即为原频数数组的下标
1 | class Solution { |
1 | class Solution { |
1 | class Solution { |
follow-up如果weight数组是mutable的
用线段树,因为需要前缀和,把二分查找前缀和的上界改成二分查找区间和的上界,只是这个区间和是从0开始的
update O(logn)
query O(logn)
pickIndex O(logn*logn)
需要注意update和pickIndex的比例,如果很少update也可以考虑普通前缀和来做这样update虽然是O(n)但是pickIndex是O(logn)
1 | class Solution { |
O(C) time O(C) space
normalize每个单词存到hashmap里
1 | class Solution { |
1 | class Solution { |
1 | class Solution { |
1 | class Solution { |
bfs O(n) time 给每个node一个伪下标并维护最小最大下标,最后利用最小下标来还原真实下标
必须自顶向下自左向右 dfs如果不维护行号会违反 bfs完美符合不用维护行号只需要把每个数放到对应column即可所以选择bfs 即排序优先级是左右上下
1 | /** |
1 | /** |
O(nlog(n/k)) time O(n) space
n是node数 k是column数 也是树的width
插入是O(n)
整理是O(k*(n/k)log(n/k)) = O(nlog(n/k))
跟314. Binary Tree Vertical Order Traversal的区别是要相同位置的数要按大小排序,所以排序优先级是左右上下大小,因此必须维护行号,理论上bfs和dfs均可,但dfs代码简单
1 | /** |
O(nlogn) time O(n) space
插入是O(nlogk) k是column数 也是树的width
整理是O(k*(n/k)log(n/k))
O(nlogk + k*(n/k)log(n/k)) = O(nlogk + nlog(n/k)) = O(nlog(k*(n/k))) = O(nlogn)
1 | /** |
如果没有1000这个限制条件,则把一维map转换成二维map
1 | /** |
exponential O(4n) time
1 | class Solution { |
exponential O(n * 4n) time
1 | class Solution { |
amortized O(1)
1 | /** |
preorder iterator
1 | /** |
inorder dfs O(n) time O(h) space
维护一个prev用root更新prev,因为prev一直被更新,所以到最后prev就是tail,最后连接head和prev(即tail)即可
1 | /* |
stack类似括号匹配O(n) time O(n) space
1 | class Solution { |
1 | class Solution { |
sliding window O(m+n) time O(1) space
跟30. Substring with Concatenation of All Words解法基本一样
1 | class Solution { |
1 | class Solution { |