算法学习-动态规划-实战二(leetcode 85)
2015-04-22 17:20
411 查看
本文主要是自己对leetcode讨论区的一个解法的理解,记录一下,方便自己复习。
问题描述:Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
解题思路:首先求出每一个点的高度。然后对于每一个点求以改高度为高,向该点左右延伸的最大矩形。
1、求高:用height(i,j)表示点(i,j)的高度:
height(i,j) = height(i-1,j) + 1, if matrix[i][j]=='1';
height(i,j) = 0, if matrix[i][j]=='0'
如对于:
得到:
2、求最左边界和最右边界:求出每一个点的高后,对于点(i,j)首先考虑以height(i,j)为高的矩形的最左边界left(i,j),这个最左边界由两个东西决定,上一个点的最左边界和(i,j)点所在行中改能够到达的最左边界(currLeft)。
最左边界不能超过上一点的最左边界和本行的最左边界;
相同的原理,左右边界为:
3、求最大面积:最后根据最右边界和最左边界求出宽,再根据已求得的高得出面积。遍历,求出最大面积。
注意:对于(i,j)点,Area(i,j)并不是以(i,j)为右下角的最大矩形,如左边一个红色的点,显然以其为右下角的最大矩形面积是3而不是6。Area(i,j)表示的是以height(i,j)为高,向(i,j)左右延伸的最大矩形面积。图中彩色框对于的就是相应颜色点的最大矩形。
完整代码:
此题还有另一种用堆栈的解法:思想要好理解一些。
问题描述:Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
解题思路:首先求出每一个点的高度。然后对于每一个点求以改高度为高,向该点左右延伸的最大矩形。
1、求高:用height(i,j)表示点(i,j)的高度:
height(i,j) = height(i-1,j) + 1, if matrix[i][j]=='1';
height(i,j) = 0, if matrix[i][j]=='0'
如对于:
得到:
2、求最左边界和最右边界:求出每一个点的高后,对于点(i,j)首先考虑以height(i,j)为高的矩形的最左边界left(i,j),这个最左边界由两个东西决定,上一个点的最左边界和(i,j)点所在行中改能够到达的最左边界(currLeft)。
最左边界不能超过上一点的最左边界和本行的最左边界;
for(int j=0;j<n;j++){ if(matrix[i][j] == '1'){ left[j] = max(left[j],currLeft);
}else{ left[j]=0; currLeft = j+1;
} }
相同的原理,左右边界为:
for(int j=n-1;j>=0;j--){ if(matrix[i][j] == '1'){ right[j] = min(right[j],currRight); }else{ right[j]=n; currRight = j; }
}
3、求最大面积:最后根据最右边界和最左边界求出宽,再根据已求得的高得出面积。遍历,求出最大面积。
注意:对于(i,j)点,Area(i,j)并不是以(i,j)为右下角的最大矩形,如左边一个红色的点,显然以其为右下角的最大矩形面积是3而不是6。Area(i,j)表示的是以height(i,j)为高,向(i,j)左右延伸的最大矩形面积。图中彩色框对于的就是相应颜色点的最大矩形。
完整代码:
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix) {
if(matrix.empty()) return 0;
const int m = matrix.size();
const int n = matrix[0].size();
int left
, right
, height
;
fill_n(left,n,0); fill_n(right,n,n); fill_n(height,n,0);
int maxA = 0;
for(int i=0; i<m; i++) {
int currLeft=0;
int currRight = n;
for(int j=0; j<n;j++){
if(matrix[i][j] == '1'){
height[j] += 1;
}else{
height[j] = 0;
}
}
for(int j=0;j<n;j++){ if(matrix[i][j] == '1'){ left[j] = max(left[j],currLeft);
}else{
left[j]=0;
currLeft = j+1;
}
}
for(int j=n-1;j>=0;j--){ if(matrix[i][j] == '1'){ right[j] = min(right[j],currRight); }else{ right[j]=n; currRight = j; }
}
for(int j=0;j<n;j++){
maxA = max(maxA,height[j]*(right[j]-left[j]));
}
}
return maxA;
}
};
此题还有另一种用堆栈的解法:思想要好理解一些。
相关文章推荐
- 算法学习-动态规划-实战一
- Leetcode算法学习日志-447 Number of Boomerangs
- 机器学习实战-kNN算法 学习随手记
- 算法学习之动态规划(leetcode 174. Dungeon Game)
- 【算法学习】双调欧几里得旅行商问题(动态规划)
- Leetcode算法学习日志-241 Different Ways to Add Parentheses
- 算法学习-动态规划
- Leetcode算法学习日志-60 Permutation Sequence
- Leetcode算法学习日志-338 Counting Bits
- 菜鸟的ACM之路(5)北大MOOC算法基础笔记__第六、七周__动态规划(下)例题实战
- 深度学习之神经网络(CNN/RNN/GAN) 算法原理+实战
- 机器学习实战_07AdaBoost元算法提高分类性能
- Leetcode算法学习日志-486 Predict the Winner
- Leetcode算法学习日志-257 Binary Tree Paths
- Leetcode算法学习日志-215 Kth Largest Element in an Array
- 动态规划与贪婪算法学习笔记
- 【算法学习笔记】83.排序辅助 动态规划 SJTU OJ 1282 修路
- 【算法学习笔记】85.破环为链 序列DP 松弛+代价 SJTU OJ 1073 能量项链
- 机器学习实战:python算法代码汇总
- 二叉树的最大深度算法面试题-leetcode学习之旅(3)