剑指 Offer 12. 矩阵中的路径
力扣官方解法:
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?