前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单记录一下看题解得到的几条经验

简单记录一下看题解得到的几条经验

作者头像
Piper蛋窝
发布2021-09-15 12:48:57
4280
发布2021-09-15 12:48:57
举报
文章被收录于专栏:Piper蛋窝Piper蛋窝

unsplash.com/@peterlaster

一些关于 C++ 语法的记录。

题目是:

  • 力扣第 59 场双周赛 T3 到达目的地的方案数
  • https://leetcode-cn.com/problems/number-of-ways-to-arrive-at-destination/

力扣的示例代码确实是精准面向面试的,里面很多写作的风格还是很值得学习的。

我自己照着思路敲了一遍,并且附上了注释。

代码语言:javascript
复制
// dijkstra 求 dist 数组
// 根据 dist[i] - dist[j] == g[i][j] 为边建有向图
// 在这个有向图上用 DP 找 0 点到 n-1 点的路线数量

class Solution {
private:
    static constexpr int mod = 1000000007;  // private

public:
    const int MOD = 1e9 + 7;
    int countPaths(int n, vector<vector<int>>& roads) {
        vector<vector<long long>> dist(n, vector<long long>(n, LLONG_MAX / 2));
        // 经验: `LLONG_MAX` 常数是在 `climits` 标头中定义的宏常数,用于获取 `long long int` 对象的最大值
        for (int i = 0; i < n; ++ i)
            dist[i][i] = 0;
        
        for (auto&& road: roads)
        {
            int x = road[0], y = road[1], z = road[2];
            dist[x][y] = z;
            dist[y][x] = z;
        }
        // 经验: C++ `auto &&` 知乎: https://zhuanlan.zhihu.com/p/25148592
        // 1. 当你想要拷贝range的元素时,使用for(auto x : range).
        // 2. 当你想要修改range的元素时,使用for(auto && x : range).
        // 3. 当你想要只读range的元素时,使用for(const auto & x : range).

        // dijkstra
        vector<int> used(n);  // 经验: C++ 中 vector<int> 可以当作 vector<bool> 用, 赋值时 `used[t] = true` 就行
        for (int _ = 0; _ < n; ++ _)  // 经验: C++ 中可以定义变量 `_`
        {
            int t = -1;
            for (int j = 0; j < n; ++ j)
                if (!used[j] && (t == -1 || dist[0][j] < dist[0][t])) t = j;
            used[t] = true;
            
            for (int j = 0; j < n; ++ j)
                dist[0][j] = min(dist[0][j], dist[0][t] + dist[t][j]);
        }

        // 建有向图
        vector<vector<int>> g(n);
        for (auto&& road: roads)
        {
            int x = road[0], y = road[1], z = road[2];
            if (dist[0][x] - dist[0][y] == z) g[y].push_back(x);
            if (dist[0][y] - dist[0][x] == z) g[x].push_back(y);
        }

        // dfs
        vector<int> f(n, -1);
        function<int(int)> dfs = [&] (int u)
        {
            if (u == n - 1) return 1;
            if (f[u] != -1) return f[u];

            f[u] = 0;
            for (auto v: g[u])
            {
                f[u] += dfs(v);
                while (f[u] >= MOD) f[u] -= MOD;
            }
            return f[u];
        };
        return dfs(0);
    }
};

**经验: **

  • LLONG_MAX 常数是在 climits 标头中定义的宏常数,用于获取 long long int 对象的最大值
  • C++ auto && 知乎: https://zhuanlan.zhihu.com/p/25148592
    1. 当你想要只读range的元素时,使用for(const auto & x : range).
    2. 当你想要修改range的元素时,使用for(auto && x : range).
    3. 当你想要拷贝range的元素时,使用for(auto x : range).
  • C++ 中 vector<int> 可以当作 vector<bool> 用, 赋值时 used[t] = true 就行
  • C++ 中可以定义变量 _for (int _ = 0; _ < n; ++ _)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Piper蛋窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档