[LeetCode] Maximal Square(!!!!DP优化)
来源:互联网 发布:淘宝最好卖的东西 编辑:程序博客网 时间:2024/05/16 06:06
定义一个D[i][j] 表示的是以i,j为右下角的最大子正方形的边长。这个边长是受限于D[i-1][j],D[i][j-1] ,D[i-1][j-1]中最小的那个的。
class Solution {public: int maximalSquare(vector<vector<char>>& A) { int m = A.size(); if(m==0) return 0; int n = A[0].size(); if(n==0) return 0; vector< vector<int> > D(m, vector<int>(n,0)); int max_area=0; for(int i = 0; i<n; ++i){ D[0][i]=A[0][i]-'0'; if(A[0][i]=='1') max_area=1; } for(int i = 0; i<m; ++i){ D[i][0]=A[i][0]-'0'; if(A[i][0]=='1') max_area=1; } for(int i =1; i<m; ++i) for(int j =1; j<n; ++j) if(A[i][j]=='1'){ D[i][j]= min(min(D[i-1][j-1],D[i-1][j]),D[i][j-1])+1; max_area = max(max_area, D[i][j]); } return max_area*max_area; }};
12ms AC
这里的方法需要两次初始化,代码可以被进一步优化。因为每次D[i][j]的求解 只依赖于D[i-1][j],D[i][j-1] ,D[i-1][j-1],所以实际上可以只维护两个行向量或列向量,这样空间复杂度变成了O(2m)或O(2n)
class Solution {public: int maximalSquare(vector<vector<char>>& A) { int m = A.size(); if(m==0) return 0; int n = A[0].size(); if(n==0) return 0; vector<int> pre(n,0); vector<int> curr(n,0); int max_area=0; for(int i=0; i<n; ++i){ pre[i]=A[0][i]-'0'; if(A[0][i]=='1') max_area = 1; } for(int i =1; i<m; ++i){ curr[0]=A[i][0]-'0'; for(int j = 1; j<n; ++j) if(A[i][j]=='1'){ curr[j]= min(min(pre[j-1],pre[j]),curr[j-1])+1; max_area = max(max_area, curr[j]); } //swap(pre,curr); //curr=vector<int>(n,0); pre.swap(curr); fill(curr.begin(),curr.end(),0); } return max_area*max_area; }};
上面的swap(两种swap都是可以的)操作查了下是常数级的时间复杂度,它不涉及到元素的复制、移动、交换操作。这样的方式和使用指针的效果是相同的。
其实进一步优化可以将空间复杂度降低到O(m)
int maximalSquare(vector<vector<char>>& matrix) { if (matrix.empty()) return 0; int m = matrix.size(), n = matrix[0].size(); vector<int> dp(m + 1, 0); int maxsize = 0, pre = 0; for (int j = 0; j < n; j++) { for (int i = 1; i <= m; i++) { int temp = dp[i]; if (matrix[i - 1][j] == '1') { dp[i] = min(dp[i], min(dp[i - 1], pre)) + 1; maxsize = max(maxsize, dp[i]); } else dp[i] = 0; pre = temp; } } return maxsize * maxsize;}
0 0
- [LeetCode] Maximal Square(!!!!DP优化)
- LeetCode Maximal Square DP
- leetcode----DP----Maximal Square
- Leetcode 221 - Maximal Square(dp)
- leetcode -- Maximal Square -- DP重点
- [Leetcode] #221 Maximal Square (DP)
- 【LeetCode】Maximal Rectangle && Maximal Square
- Leetcode:Maximal Square & Maximal Rectangle
- leetcode013-Maximal Square(dp)
- LeetCode 题解(117): Maximal Square
- Leetcode学习之Maximal Square(221)
- LeetCode 221. Maximal Square(最大正方形)
- [leetcode] Maximal Square
- Maximal Square Leetcode Java
- [leetcode] Maximal Square
- leetcode 221: Maximal Square
- LeetCode Maximal Square
- Maximal Square - LeetCode 221
- 情绪相关
- 杭电2602
- JavaWeb:Unable to compile class for JSP
- 常用命令
- android 后台附件下载
- [LeetCode] Maximal Square(!!!!DP优化)
- axis1发布方式进阶篇
- 争与不争
- opensessioninview
- 观点 | 为什么说云主机比物理机故障率更低?
- 数据结构堆的实现
- axis1发布方式
- iOS程序员面试题系列(1)
- Codeforces Round #290 (Div. 2) - C. Fox And Names (拓扑排序)