Leecode刷题C语言之骑士拨号器

执行结果:通过

执行用时和内存消耗如下:

代码如下:

复制代码
#define MOD 1000000007

int knightDialer(int n) {
    int moves[10][4] = {
        {4, 6, -1, -1},
        {6, 8, -1, -1},
        {7, 9, -1, -1},
        {4, 8, -1, -1},
        {3, 9, 0, -1},
        {-1, -1, -1, -1},
        {1, 7, 0, -1},
        {2, 6, -1, -1},
        {1, 3, -1, -1},
        {2, 4, -1, -1}
    };
    int d[2][10] = {0};
    for (int i = 0; i < 10; i++) {
        d[1][i] = 1;
    }
    for (int i = 2; i <= n; i++) {
        int x = i & 1;
        for (int j = 0; j < 10; j++) {
            d[x][j] = 0;
            for (int k = 0; moves[j][k] != -1; k++) {
                d[x][j] = (d[x][j] + d[x ^ 1][moves[j][k]]) % MOD;
            }
        }
    }
    int res = 0;
    for (int i = 0; i < 10; i++) {
        res = (res + d[n % 2][i]) % MOD;
    }
    return res;
}

解题思路:

  1. 定义骑士的移动路径
    • 首先,需要明确骑士在每个数字上能够移动到的下一个数字。使用moves数组来表示每个数字能够移动到的下一个数字的集合。例如,数字0可以移动到数字46,数字1可以移动到数字68,依此类推。不存在的移动用-1表示。
  2. 动态规划初始化
    • 使用一个二维数组d来存储每一步在每个数字上能够到达的不同路径的数量。数组d的第一维表示步数(奇数和偶数步分别用两个子数组表示以减少空间复杂度),第二维表示数字(0到9)。
    • 初始化时,对于第一步(i=1),每个数字都只能从自己出发,所以每个数字上的路径数量都为1。
  3. 动态规划状态转移
    • 从第二步开始,对于每一步和每一个数字,计算到达该数字的不同路径的数量。这是通过遍历所有可以从当前数字出发到达的下一个数字,并累加这些下一个数字在上一步的路径数量来实现的。
    • 为了减少空间复杂度,使用滚动数组技巧,只保留当前步和上一步的信息,通过i & 1x ^ 1来切换当前步和上一步的数组。
  4. 结果汇总
    • 最后,将所有数字在n步时的路径数量相加,得到总路径数量,并对MOD取模,以防止整数溢出。

关键点

  • 动态规划:使用动态规划来记录每一步在每个数字上的路径数量,避免重复计算。
  • 滚动数组 :利用滚动数组技巧来减少空间复杂度,使空间复杂度从O(n * 10)降低到O(10)
  • 取模运算 :每一步的累加结果都对MOD取模,以防止整数溢出。

复杂度分析

  • 时间复杂度O(n * 10 * 4),因为对于每一步(n步),每个数字(10个)最多有4个可能的下一个数字。
  • 空间复杂度O(10),使用滚动数组技巧,只保留当前步和上一步的信息。
相关推荐
平凡但不平庸的码农1 小时前
Go Slice 详解
算法·golang
想学习java初学者2 小时前
SpringBoot整合Vertx-Mqtt多租户(优化版)
java·spring boot·后端
AC赳赳老秦2 小时前
政企内网落地:OpenClaw 离线环境深度适配方案,无外网场景下本地化模型对接与全功能使用
java·大数据·运维·python·自动化·deepseek·openclaw
weixin_449173653 小时前
在 Java 中,‌线程安全的 List‌ 主要有以下几种实现方式,它们的效率取决于具体的使用场景(尤其是读写比例):
java·线程安全的list
砚底藏山河3 小时前
股票数据API接口:如何获取股票历历史分时KDJ数据
java·python·maven
炸膛坦客4 小时前
嵌入式 - 数据结构与算法:(1-7)数据结构 - 顺序表和链表的对比
数据结构·链表
MegaDataFlowers4 小时前
运行若依项目
java
lulu12165440784 小时前
JetBrains IDE 终极AI编程方案:CC GUI插件让Claude Code和Codex丝滑运行
java·ide·人工智能·python·ai编程
Jasmine_llq5 小时前
《B3867 [GESP202309 三级] 小杨的储蓄》
算法·循环遍历·数组累加(模拟)·索引定位·顺序输出
啦啦啦_99995 小时前
案例之 逻辑回归_电信用户流失预测
算法·机器学习·逻辑回归