给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
本题求解采用了DP+BFS的方法。
- 求解步骤
- 对
matrix
中的每一对(i,j)
进行DFS处理 - 对节点
(i,j)
,它所能到达的最远距离(结果存放在二维数组visited
中)
visited[i][j] = 1+ max(DFS(i-1,j),DFS(i+1,j),DFS(i,j+1),DFS(i,j-1));
- 更新
ret
的值,ret = max(ret,visited[i][j])
- 重复上述操作,直到遍历结束
- 对
- c++代码
#define MAX(x,y) ((x>y)?(x):(y))
class Solution {
public:
int rows, cols;
int longestIncreasingPath(vector<vector<int>>& matrix) {
rows = matrix.size();
if(!rows) return 0;
cols = matrix[0].size();
vector<vector<int>> visited(rows, vector<int>(cols, 0));
int ret = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
ret = MAX(ret,DFS(matrix, visited, i, j,INT_MIN));
}
}
return ret;
}
int DFS(vector<vector<int>> &matrix, vector<vector<int>> &visited, int i, int j, int lastvalue) {
if (i < 0 || i >= rows || j < 0 || j >= cols)
return 0;
int curvalue = matrix[i][j];
if (curvalue <= lastvalue)
return 0;
int u, r, l, d;
if (!visited[i][j]) {
u = DFS(matrix, visited, i+1, j, curvalue);
r = DFS(matrix, visited, i, j+1, curvalue);
l = DFS(matrix, visited, i, j-1, curvalue);
d = DFS(matrix, visited, i-1, j, curvalue);
visited[i][j] =1 + MAX(MAX(u, r), MAX(l, d));
}
return visited[i][j];
}
};
INT_MIN在标准头文件limits.h中定义。
给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点
node
的新值等于原树中大于或等于node.val
的值之和。
利用二叉搜索树的特性,最大的在最右边,而题目要求比当前结点相等或大的数字之和,那么就从最右边开始遍历,因为没人比它大,然后中序遍历,因为二叉搜索树的特征就是小中大 从大的数据到小的数据,路上把每个结点的数据存起来,到每个结点就和当前结点加一下然后给它。
class Solution {
public:
int val = 0;
TreeNode* bstToGst(TreeNode* root) {
if (root) {
//下面:描述依次运行过程
bstToGst(root->right); //递归,会一直走到头,也就是最右边那个数才停下来
val += root->val; //走到最右边那个数,开始计算此时, val=0;
root->val = val; // 重新赋值最右边那个数
bstToGst(root->left); //由于最右边数的无左孩子,故再递归一步后直接退回
}
return root;
}
};