首页 > 其他分享 >剑指 Offer 12. 矩阵中的路径

剑指 Offer 12. 矩阵中的路径

时间:2023-08-13 23:44:41浏览次数:35  
标签:12 Offer int 矩阵 vector board && visited true

力扣官方解法:

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int h = board.size(), w = board[0].size();
        vector<vector<int>> visited(h, vector<int>(w));
        for(int i = 0; i < h; i ++ )
            for(int j = 0; j < w; j ++ ) {
                if(check(board, visited, i, j, word, 0)){
                    return true;
                }
            }
        return false;
    }


    bool check(vector<vector<char>> &board, vector<vector<int>> &visited, int i, int j, string &s, int k){
        if(board[i][j] != s[k]) return false;
        if(k == s.length() - 1) return true;
        vector<pair<int, int>> dirs{{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
        bool result = false;
        visited[i][j] = true;

        for (const auto &dir : dirs) {
            int newi = i + dir.first, newj = j + dir.second;
            if(newi >= 0 && newi < board.size() && newj >= 0 && newj < board[0].size()) {
                // 定义result的原因是为了防止走进死路(上下左右均被访问过)的情形出现
                if(!visited[newi][newj]) {
                    bool flag = check(board, visited, newi, newj, s, k + 1);
                    if(flag) {
                        result = true;
                        break;
                    }
                }
            }
        }
        visited[i][j] = false;
        return result;
    }
};

时间1436 ms,内存231.3 MB

由于空间上每次迭代还要开辟dirs,因此造成空间时间浪费。

优化的解法:

在空间上,将创建每步移动的坐标(-1,1,0,0)放到迭代函数外面,避免重复开辟内存;

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int h = board.size(), w = board[0].size();
        vector<vector<bool>> visited(h, vector<bool>(w, true));
        int dx[4] = {0, 0, -1, 1}, dy[4] = {1, -1, 0, 0};
        int index = 1;
        for(int i = 0; i < h; i ++ )
            for(int j = 0; j < w; j ++ )
                if(board[i][j] == word[0] && check(board, word, dx, dy, i, j, index, visited)) return true; 
        return false;
    }

    bool check(vector<vector<char>> &board, string& s, int dx[4], int dy[4], int i, int j, int index, vector<vector<bool>> &visited) {
        if(index == s.size()) return true;
        visited[i][j] = false;
        bool ans = false;
        for(int z = 0; z < 4; z ++ ){
            int x = i + dx[z], y = j + dy[z];
            // 不超出board范围&&没有访问过&&符合下一个字符要求&&下一个check成立
            if(x >= 0 && x < board.size() && y >= 0 && y < board[0].size() && visited[x][y] && board[x][y] == s[index] && check(board, s, dx, dy, x, y, index + 1, visited)) {
                ans = true;
                break;
            }
        }
        // 恢复现场
        visited[i][j] = true;
        return ans;
    }
};
用时232 ms,内存占用6.2 MB

标签:12,Offer,int,矩阵,vector,board,&&,visited,true
From: https://www.cnblogs.com/luxiayuai/p/17627541.html

相关文章

  • 8.12模拟赛小结
    前言最ez的一集T1打工原题化简题意:有\(n\)个工作,每个工作有固定的工资截止时间你可以在\(1\)个时间单位内选择一项工作并完成它求最后最大工资思考:诶好像做个这个题?上次似乎讲过,用反悔贪心来做思路:首先讲原工作的截止时间从小到大排序然后每次遍历一个工作如果......
  • python实战练习1:矩阵和整数相乘
       1#方法一:这是最先想到的2s=[[1,2,3],[4,5,6],[7,8,9]]3n=int(input())45r=[]6foriins:7a=[]#这个很重要,每次要清空8forjini:9a.append(j*n)10r.append(a)1112print(r)13141516171......
  • Redmi Note 12 Turbo苹果主题
    主题类型:混搭预览效果如下混搭类型测试MIUI版本12-13-14通用锁屏样式超级景深Max通知栏超级景深Max图标AP14超级景深短信主题听云间拨号于联系人听云间桌面AP14超级景深......
  • 12 享元模式 -- go语言设计模式
    享元模式(FlyweightPattern)是一种结构型设计模式,用于有效地支持大量细粒度对象的共享。享元模式通过共享对象的方式来减少内存使用和提高性能。享元模式的实现代码packagemainimport("fmt""sync")/*业务场景描述:-租车场景,客户像车行租车,如果车行有车直接租......
  • dp-矩阵链相乘顺序
    矩阵链相乘顺序目录矩阵链相乘顺序问题描述举例说明问题分析程序问题描述A1,A2,..,An表示n个矩阵的序列,其中Ai为\(P_{i−1}×P_i\)阶矩阵,i=1,2,...,n。向量P=<P0,P1,P2..Pi>表示矩阵链的输入,其中P0是A1的行数,P1是A1的列数,P1是A2的行数,以此类推。计算这个矩阵需要做n−1次两......
  • 【Java】美团8.12笔试复盘
    5道编程题2小时如果您看到哪里有问题,万望评论区指正,在此谢过!!!第一题:数组遍历importjava.util.Scanner;publicclassNextNumbers{/*题目:给你一个排列和两个数问你:这两个数在排列里是不是相邻输入:第一行:n代表排列中数的个数第二行:a1--an......
  • 剑指 Offer 54. 二叉搜索树的第k大节点(简单)
    题目:classSolution{public:voidtraversal(TreeNode*cur,vector<int>&result){//本题利用二叉搜索树的排序性质if(cur==nullptr)return;traversal(cur->right,result);//唯一要注意的是题目要求第k大的,所以要把大的放在前面。遍历顺序......
  • 一个mysql dba的成长之旅--第零章 绝处逢生:意外收到dba offer
    (本故事纯属虚构,如有雷同实属巧合)2018年的一个秋天的下午,江南理工大学图书馆一楼的宣讲会大厅人头攒动,充满了期待的氛围。这里正在举办一场国内知名互联网公司的宣讲会,吸引了众多毕业生前来倾听。小李身穿一套整洁的求职西装,手里拿着整齐的彩色简历,坐在室友旁边,全神贯注地聆听着台......
  • 【专题】中国职业教育发展报告(2012-2022年)报告PDF合集分享(附原数据表)
    学习能力是将知识资源转化为知识资本的能力。它包括对所学内容的兴趣和热情,有助于更深入理解和掌握知识,提高个人的认知和思维能力。阅读原文,获取专题报告合集全文,解锁文末158份学习教育行业相关报告。教育和娱乐支出越来越成为家庭消费的重要组成部分。这包括对18岁以下儿童的素质......
  • 8.12 2014 年 JOI 圆满结束
    稻草人按\(x\)排序,可以将问题转化为寻找点对\((i,j)\),使得\(y[i]<y[j]\)且对于所有\(i<k<j\),都不满足\(y[i]<y[k]<y[j]\)。点对问题,考虑\(CDQ\)分治。容易发现最终对点\(i\)产生贡献的\(j\)的\(y[j]\)单调递减,可以使用单调栈维护。单调栈内即是右边所有可以满......