【剑指offer】矩阵中的路径

矩阵中的路径

https://www.nowcoder.com/practice/c61c6999eecb4b8f88a98f66b273a3cc?tpId=13&tqId=11218&rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

这道题卡住的原因是new数组的初始化方法没有弄清楚
C++的动态数组里,string这样的类类型是会自动调动默认构造函数初始化,但是基本数据类型是不会自动初始化的,需要在后面加上括号初始化成默认值,如本题bool数组初始化为false,否则内存是脏的,不能AC
M,N 分别为矩阵行列大小, K 为字符串 word 长度。
时间复杂度 O(3^KMN)
最差情况下,需要遍历矩阵中长度为 K 字符串的所有方案,时间复杂度为 O(3^K);矩阵***有 MN 个起点,时间复杂度为 O(MN) 。
方案数计算: 设字符串长度为 K ,搜索中每个字符有上、下、左、右四个方向可以选择,舍弃回头(上个字符)的方向,剩下 3 种选择,因此方案数的复杂度为 O(3^K)
**空间复杂度 O(K) : 搜索过程中的递归深度不超过 K ,因此系统因函数调用累计使用的栈空间占用 O(K) (因为函数返回后,系统调用的栈空间会释放)。最坏情况下 K = MN ,递归深度为 MN ,此时系统栈使用 O(MN) 的额外空间。

class Solution {
public:
    bool hasPath(char* matrix, int rows, int cols, char* str) {
        bool* flag = new bool[strlen(matrix)]();
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (judge(matrix, rows, cols, i, j, str, 0, flag))
                    return true;
            }
        }
        return false;
    }

    bool judge(char* matrix, int rows, int cols, int i, int j, char* str, int k, bool* flag) {
        int index = i * cols + j;
        if (i < 0 || i >= rows || j < 0 || j >= cols || matrix[index] != str[k] || flag[index] == 1)
            return false;
        if(k == strlen(str) - 1) return true;
        flag[index] = 1;
        if (judge(matrix, rows, cols, i - 1, j, str, k + 1, flag)
                || judge(matrix, rows, cols, i + 1, j, str, k + 1, flag)
                || judge(matrix, rows, cols, i, j - 1, str, k + 1, flag)
                || judge(matrix, rows, cols, i, j + 1, str, k + 1, flag)) {
            return true;
        }
        flag[index] = 0;
        return false;
    }
};
全部评论

相关推荐

2024-12-07 16:16
已编辑
四川大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务