力扣双周赛第59场(上)

171 阅读1分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

1974. 使用特殊打字机键入单词的最少时间

截屏2021-08-26 下午8.41.42.png

截屏2021-08-26 下午8.41.55.png

思路分析

本题其实只需要注意下到底是选择顺时针和逆时针就可以了,那么对于选择指针移动最小时间代码如下:

int minJian(char a, char b){
    if(b - a < 0){
        return minJian(b, a);
    }
    return min(b - a, a + 26 - b);
}

代码比较简单,不过讲道理作为第一题够用了。

1976. 到达目的地的方案数

截屏2021-08-26 下午8.55.33.png

截屏2021-08-26 下午8.55.51.png

思路分析

由于答案可能很大,将结果对 $10^9$ + 7 取余 后返回。

这句话听着挺吓人的,但其实还是很简单的逻辑,首先,无向图对我们来说并没有太大意义,我们也不需要性价比不高的边。所以我们需要通过狄杰斯特拉算法进行剪枝

(这里感觉介绍狄杰斯特拉算法没必要,如果有人点赞就下篇文章更一下,就是给定起点计算出所有可达点的最短路径)

狄杰斯特拉算法计算过后是有向且不会出现环的,假设有点a,b,c构成环,且a为起点,那么如果c可由ab路径到达,则必不会存在ac路径。(更不会出现ca路径,因为a到a一定为0)

所以在没有环的情况下,可以利用dfs计算到某个点的次数,假设到u,v亮点的次数为dp[u],dp[v],如果有一点p且n = dp[u] + dist(u, p) = dp[v] + dist(v, p)且dp[p]未计算或大于n,则有dp[p] = dp[u] + dp[v] % 10910^9