【剑指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;
    }
};
全部评论

相关推荐

01-11 02:09
已编辑
华中师范大学 golang
京京洪洪学java:如果坚定转Java就要先做好暑期结果可能没那么好的准备,大厂也有做go的,也有接受内部切换技术栈的,go怎么就不行了呢?,ACM+华师肯定能接到一些大厂面试的,acm铜的基础可以让你比较轻松地应对中大厂的手撕,就是八股和项目要下硬功夫,至于找不到go项目?github上一直刷啊,跟刷b站主页一样,那么多好的go开源项目,怎么会找不到呢?刷到想学感兴趣的用ai吃透,试着改进或者吸收作为自己的项目,另一个选择就是考研了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务