复盘|第102场双周赛
查询网格图中每一列的宽度
【模拟】python可以转置完直接遍历列(其他语言遍历下标),然后求数字字符串形式的长度。
一个数组所有前缀的分数
【前缀和】一边遍历一边计算前缀最大值 mx,以及前缀的得分之和 sm。
二叉树的堂兄弟节点 II
【BFS】对于每个节点node来说,它所有堂兄弟节点的和,等价于node这一层所有节点值之和减去node及其兄弟节点值之和。BFS遍历二叉树,对于每一层,首先遍历当前层的每个节点,通过节点的左右儿子计算下一层的节点值之和,然后再次BFS遍历当前层的每个节点node,计算node的左右儿子的节点值之和,更新node 的左右儿子节点的节点值。
设计可以求最短路径的图类
【Dijkstra】输入的图最坏是稠密图,用邻接矩阵建图。定义start为起点,dis[i]为start到i的最短路的长度,初始化dis[start] = 0,其余dis[i] = inf。首先从start出发,更新邻居的最短路,下一步寻找除去start的dis的最小值,设这个点为x,那么dis[x]就已经是从start到x的最短路的长度了。再寻找dis最小值时,用vis数组排除在前面循环中找到的x。
【Floyd】定义d[k][i][j]为i到j的最短路长度,并且从i到j的路径上的中间节点(不含i和j)的编号至多为k,分类讨论:如果i到j的路径上的节点编号没有k,那么d[k][i][j] = d[k - 1][i][j];如果i到j的路径上的节点编号有k,可以是做先从i到k,再从k到j,那么d[k][i][j] = d[k - 1][i][k] + d[k - 1] [k][j]。取最小值,d[k][i][j] = min(d[k - 1][i][j], d[k - 1][i][k] + d[k - 1][k][j])。初始值d[0][i][j] 为原图中i到j的边长,如果不存在则为inf。最终i到j的最短路长度为d[k - 1][i][j]。代码实现时第一个维度可以优化掉,即d[i][j] = min(d[i][j], d[i][k] + d[k][j])。