力扣-221-最大正方形
题目题解是这么说的,定义一个二维dp数组
其中dp[i][j]表示以nums[i][j]为右下角的最大正方形
对于任意dp[i][j],如果dp[i][j]0,那它必不可能组成正方形,所以置0
对于dp[i][j]k,只有dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]都不小于k-1才有可能组成正方形
如果只有两个或一个满足,则dp[i][j]=k-1
另外是需要一个最大数字来保存最大“边长”?
int maximalSquare(vector<vector<char>>& matrix) { int m = matrix.size(),n = matrix[0].size(); vector<vector<int>> dp(m,vector<int>(n,0)); int maxSideLength = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { // 初始化 if (i == 0 && matrix[i][j] == '1') dp[i][j] = 1; if (j == 0 && matrix[i][j] == '1') dp[i][j] = 1; if (i>0&&j>0&&matrix[i][j] == '1') dp[i][j] = min(min(dp[i - 1][j], dp[i - 1][j - 1]), dp[i][j - 1])+1; if (dp[i][j] > maxSideLength) maxSideLength = dp[i][j]; } } return pow(maxSideLength, 2); }
这样,虽然我现在还没想明白为什么能这样,可能动态规划最难的就是想dp数组的定义了
尝试用三个变量替代dp数组做空间优化?感觉这个dp数组不是很好去掉的,得不偿失,但空间效率确实又比较差
还是就先这样吧
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/16862614.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步