当前位置: 首页 > article >正文

剑指 Offer(第2版)面试题 12:矩阵中的路径

剑指 Offer(第2版)面试题 12:矩阵中的路径

  • 剑指 Offer(第2版)面试题 12:矩阵中的路径
    • 解法1:回溯

剑指 Offer(第2版)面试题 12:矩阵中的路径

题目来源:23. 矩阵中的路径

解法1:回溯

回溯算法模板题。

我们先枚举单词的起点,然后依次枚举单词的每个字母。

过程中需要将已经使用过的字母改成一个特殊字母(‘*’),以避免重复使用字符,注意回溯是要把特殊字母改回原来的状态,这也是回溯算法的精髓。

代码:

class Solution
{
private:
	const int dx[4] = {-1, 0, 1, 0};
	const int dy[4] = {0, 1, 0, -1};

public:
	bool hasPath(vector<vector<char>> &matrix, string &str)
	{
		// 特判
		if (matrix.empty())
			return false;
		int m = matrix.size(), n = m ? matrix[0].size() : 0;
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				if (backtracking(matrix, str, 0, i, j))
					return true;
		return false;
	}
	// 辅函数 - 回溯
	bool backtracking(vector<vector<char>> &matrix, string &str, int level, int x, int y)
	{
		if (matrix[x][y] != str[level])
			return false;
		if (level == str.size() - 1)
			return true;
		char c = matrix[x][y];
		matrix[x][y] = '*';
		for (int i = 0; i < 4; i++)
		{
			int r = x + dx[i], c = y + dy[i];
			if (r >= 0 && r < matrix.size() && c >= 0 && c < matrix[0].size())
				if (backtracking(matrix, str, level + 1, r, c))
					return true;
		}
		matrix[x][y] = c;
		return false;
	}
};

复杂度分析:

时间复杂度:O(m*n*3k),其中 m 和 n 分别是二维矩阵 matrix 的行数和列数。遍历二维矩阵 matrix 的每个元素,作为单词的起点,单词的每个字母一共有上下左右四个方向可以选择,但由于不能走回头路,所以除了单词首字母外,仅有 3 种选择。

空间复杂度:O(1)。


http://www.kler.cn/a/153667.html

相关文章:

  • 职场轶事:哭笑不得的领导与同事
  • 8.ROS的TF坐标变换(二):动态坐标变换、多坐标变换代码讲解(以LIO-SAM为例)
  • CSS新手入门笔记整理:CSS文本样式
  • STM32 定时器TIM
  • json.decoder.JSONDecodeError: Extra data: line 1 column 332 (char 331)
  • Leetcode—1094.拼车【中等】
  • C语言——I /深入理解指针(二)
  • 数字图像处理(实践篇) 十六 基于分水岭算法的图像分割
  • flutter-一个可以输入的数字增减器
  • php获取过去一段的时间范围
  • 【CTA认证】Android8实现android6以下的应用运行时也要申请权限
  • InsCode实践分享
  • 《LeetCode力扣练习》代码随想录——哈希表(赎金信---Java)
  • complex rsa
  • PMIC : 一颗芯片解决N多问题
  • 【C++】string类模拟实现过程中值得注意的点
  • LeetCode | 965. 单值二叉树
  • FWT+高维前缀和:Gym - 103202M
  • scrapy的建模及管道的使用
  • Spring Boot 3.2 新特性之 JdbcClient