每日一解 矩阵中的最长递增路径

标题 矩阵中的最长递增路径

给定一个整数矩阵,找出最长递增路径的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

示例 1:
输入: nums =
[
[9,9,4],
[6,6,8],
[2,1,1]
]
输出: 4
解释: 最长递增路径为 [1, 2, 6, 9]。

示例 2:
输入: nums =
[
[3,4,5],
[3,2,6],
[2,2,1]
]
输出: 4
解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix

思路

比常见的动归复杂了很多,第一反应甚至觉得可能是个O(nn)级别的算法。然后果断去看了看优秀解答,其中深度优先搜索配合记忆搜索结果是非常适合的,所以我这里采用这个思路。其实讲出来深度优先搜索就已经挺明显的了。从某个数开始深度优先是可以得到某个点的最终答案的,同时在单元格里记录这一点,此后其他点遍历到这个格子的时候,直接取记录即可。

代码实现

class Solution {
    
    
public:
	int longestIncreasingPath(vector<vector<int>>& matrix) {
    
    
		vector<vector<int>>dp_map;
		if (matrix.size() > 0) {
    
    
			dp_map = vector<vector<int>>(matrix.size(), vector<int>(matrix[0].size(), -1));
		}
		int answer = 0;
		for(int i = 0; i < matrix.size(); i++){
    
    
			for (int j = 0; j < matrix[0].size(); j++) {
    
    
				if (Path_reverse(matrix, dp_map, i, j) > answer) {
    
    
					answer = dp_map[i][j];
				}
			}
		}
		return answer;
	}
	int Path_reverse(vector<vector<int>>& matrix, vector<vector<int>>& dp_map, int row, int column) {
    
    
		if (dp_map[row][column] == -1) {
    
    
			int answer = 1;
			int column_data = 0, row_data = 0;
			if (column > 0 && matrix[row][column - 1] > matrix[row][column]) {
    
    
				row_data = Path_reverse(matrix, dp_map, row, column - 1);
			}
			if (column < matrix[0].size() - 1 && matrix[row][column + 1] > matrix[row][column]) {
    
    
				row_data = max(row_data, Path_reverse(matrix, dp_map, row, column + 1));
			}
			if (row > 0 && matrix[row - 1][column] > matrix[row][column]) {
    
    
				column_data = Path_reverse(matrix, dp_map, row - 1, column);
			}
			if (row < matrix.size() - 1 && matrix[row + 1][column] > matrix[row][column]) {
    
    
				column_data = max(column_data, Path_reverse(matrix, dp_map, row + 1, column));
			}
			answer += max(row_data, column_data);
			dp_map[row][column] = answer;
		}
		return dp_map[row][column];
	}
};

猜你喜欢

转载自blog.csdn.net/new_DYX/article/details/107588699