1. 层次遍历
层次遍历,只保留最右侧的那个值。
时间复杂度O(n)
,空间复杂度O(n)
。
1 | /** |
2. DFS
按照“根右左”的顺序访问节点,则优先访问到的就是最右侧的节点。
这种方法需要记录高度,当某个高度第一次被访问到的时候,储存遇到的第一个节点的值。
时间O(n)
,空间O(n)
。
层次遍历,只保留最右侧的那个值。
时间复杂度O(n)
,空间复杂度O(n)
。
1 | /** |
按照“根右左”的顺序访问节点,则优先访问到的就是最右侧的节点。
这种方法需要记录高度,当某个高度第一次被访问到的时候,储存遇到的第一个节点的值。
时间O(n)
,空间O(n)
。
1 | class Solution { |
遍历与BFS。时间复杂度O(mn)
,空间复杂度O(mn)
(visited数组)。
1 | class Solution { |
两个指针初始时在左右两侧,逐渐向内靠拢。
每次两个指针形成的容器,最小的那个是瓶颈,接下来需要向内移动瓶颈或非瓶颈的指针。
如果保持瓶颈指针不动,向内移动非瓶颈指针,由于宽度减小,并且无论非瓶颈指针向内移动后得到的边界是大是小,容器的总容积总是减小(一定受瓶颈指针的影响)
因此需要向内移动瓶颈指针,这样才可能遇到更大的容积。
时间复杂度O(n)
,空间复杂度O(1)
.
1 | class Solution { |
时间复杂度需要排序O(nlogn)
,空间复杂度存答案O(n)
。
1 | class Solution { |
建一个超级源点0,BFS计算从0到1的距离。
时间复杂度O(mn)
,空间复杂度O(mn)
。
1 | class Solution { |
dp[i][j]
代表matrix[i][j]
到最近的0的距离。
转移方程(仅针对1)为,遍历上下左右四个位置(ni, nj):
dp[i][j] = min(dp[i][j], dp[ni][nj] + 1), 当matrix[ni][nj] == 1时;
dp[i][j] = 1, 当matrix[ni][nj] == 0时。
1 | class Solution { |
设计 dp[i][j]
代表i层楼j个蛋,最少需要多少次一定能测出分界楼层。
想象在任意楼层,扔下一个鸡蛋,可能有碎和不碎两种结果。碎则说明分界楼层在下部分,不碎则说明在上部分。
由于我们不知道分界楼层到底在哪里,而是要求 dp[i][j]
次一定能找出该楼层,所以得到状态转移方程:
dp[i][j] = min_x(max(dp[x-1][j-1], dp[i-x][j])) + 1
i层楼j个蛋能够测出分界楼层需要的最少次数 = 遍历中间任意一层楼x在此处扔鸡蛋找一个最小值(max(在x楼扔碎了去下半部分再找需要的次数, 在x楼扔没碎去上半部分再找需要的次数))+1
这道题可以是把链表逆序,变成低位到高位,也可以通过栈存储每一个节点,从而通过后入先出将链表逆序。
对于逆序处理的问题,可以优先考虑栈。
1 | /** |
1 | class Twitter { |
1 | struct tweet { |
1 | class Solution { |
主要学会string的find_first(last)_of()
函数和find_first(last)_not_of()
函数的使用。
分别是找到第一个(最后一个)参数的位置和找到第一个(最后一个)不是参数的位置。
而find()
和find_first_of()
的区别是:s.find("abc")
必须找到s
中子串abc
的位置,而s.find_first_of("abc")
只需要找到s
中a或b或c中任意一个字符的第一个位置。s.substr(起始位置, 截取长度(默认到结尾))
s.erase(迭代器开始, 迭代器结束(不含)(默认到结尾))
s.erase(起始位置, 删除长度(默认到结尾))
1 | class Solution { |