链接
题解:
本题是要镜像反转二叉树,相当于从中间一分,然后把左子树和右子树对调,但又不是简单的对调,还要继续反转子树的子树,所以要用递归。
我们特判root是否为空(否则出现nullptr->nullptr的错误,模拟一下就知道了),然后交换左右孩子,交换完之后第二层就算是反转完了,然后我们反转以root->left为root的树,然后反转以root->right为root的树......
代码:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(!root)return nullptr;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
链接
如何得证?
因为我们想着是否可以推出:
而>=这个假设如何得证?
我们只需要假设它是严格小于的,然后退出矛盾后,大于等于就得证。
具体链接
代码:
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int res = 0;
if(matrix.empty())return 0;
int m = matrix.size();
int n = matrix[0].size();
vector<vector<int>> f(m+1,vector<int>(n+1));
for(int i = 1;i<=m;i++){
for(int j = 1;j<=n;j++){
if(matrix[i-1][j-1]=='1'){
f[i][j]=min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1;
res = max(res,f[i][j]);
}
}
}
return res*res;
}
};
注意:我们开了一个+1长的数组,方便处理i -1 j -1 这种边界问题,但是matrix应该从0 0 开始算起,所以我们if判断时减去1