LeetCode536. 从字符串生成二叉树
#递归 #栈 #二叉树
题目描述
你需要用一个包括括号和整数的字符串构建一棵二叉树。
输入的字符串代表一棵二叉树。它包括整数和随后的 0 、1 或 2 对括号。整数代表根的值,一对括号内表示同样结构的子树。
若存在子结点,则从左子结点开始构建。
1 | 示例 1: |
1 | 输入: s = "4(2(3)(1))(6(5))" |
解题思路
(1). 很明显的递归题,而且题目中包含有对括号的处理,遇到括号首先就是考虑使用栈来记录下合法括号内的字符串;
(2). 首先要将父节点的值从字符串中抠出来,然后分别记录下左子树和右子树的字符串,这里可以设置一个哨兵,当左子树被分离出来后,用哨兵记录,那么下一次记录的合法字符串就是右子树。
解题代码
1 | /** |
LeetCode370. 区间加法
#差分数组
题目描述
假设你有一个长度为 n 的数组,初始情况下所有的数字均为 0,你将会被给出 k 个更新的操作。
其中,每个操作会被表示为一个三元组:[startIndex, endIndex, inc],你需要将子数组 A[startIndex … endIndex](包括 startIndex 和 endIndex)增加 inc。
请你返回 k 次操作后的数组。
1 | 示例: |
解题思路
(1). 如果采用暴力的方式,需要在遍历 updates
的同时遍历结果数组,时间代价巨大;
(2). 观察到执行 updates
的顺序与最终结果无关。那么我们可以针对区间进行更新;
(3). 具体的思路是:对于每一组 updates[i]
,我们提取出 left
、right
、val
这三个值分别代表左边界、右边界、更新值。我们只需要建立一个差分数组 diff
,对 diff[left]
加上 val
,对 diff[right+1]
减去 val
,那么之后就可以通过区间的记录还原最终的输出结果;
(4). 最后通过前缀和计算最终的输出结果
时间复杂度
O(N)
解题代码
1 | func getModifiedArray(length int, updates [][]int) []int { |
LeetCode692. 前K个高频单词
#优先队列 #字典序
题目描述
给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。
1 | 示例 1: |
解题思路
(1). 以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决,本题适合使用优先队列,对于这种既要考虑优先级,又要考虑字符串构成的情况,怎样构建优先队列可以参考 堆的Go语言实现
(2). 注意考虑在出现次数一样的情况下,要依赖字符串的字典序排序,可以使用 strings.Compare
方法来比较字典序;
(3). 要输出最大的 k
个,可以采取建立容量上限为 k
的小根堆的做法。
解题代码
1 | type wordCount struct { |
- Post title:早起刷题(Day 8)
- Post author:洪笳淏
- Create time:2022-04-08 06:00:00
- Post link:https://jiahaohong1997.github.io/2022/04/08/早起刷题(Day 8)/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.