LeetCode:85. Maximal Rectangle(最大的矩形)
文章最前: 我是Octopus,这个名字来源于我的中文名—章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
- LeetCode:55. Jump Game(跳远比赛)
- Leetcode:300. Longest Increasing Subsequence(最大增长序列)
- LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)
文章目录:
题目描述:
java实现方法1:
python实现方法1:
java实现方法2:
python实现方法2:
源码github地址:https://github.com/zhangyu345293721/leetcode
题目描述:
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
来源:力扣(LeetCode)
java实现方法1:
/**
* 计算最大矩形
*
* @param matrix 二维数组
* @return 矩形
*/
public int maximalRectangle(char[][] matrix) {
if (matrix == null || matrix.length == 0) {
return 0;
}
int res = 0;
int m = matrix.length;
int n = matrix[0].length;
int[] left = new int[n];
int[] right = new int[n];
int[] height = new int[n];
Arrays.fill(right, n);
for (int i = 0; i < m; i++) {
int curleft = 0, curright = n;
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {
height[j]++;
} else {
height[j] = 0;
}
}
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {
left[j] = Math.max(left[j], curleft);
} else {
left[j] = 0;
curleft = j + 1;
}
}
for (int j = n - 1; j >= 0; j--) {
if (matrix[i][j] == '1') {
right[j] = Math.min(right[j], curright);
} else {
right[j] = n;
curright = j;
}
}
for (int j = 0; j < n; j++) {
res = Math.max(res, (right[j] - left[j]) * height[j]);
}
}
return res;
}
时间复杂度:O(n*m)
空间复杂度:O(m)
python实现方法1:
def maximal_rectangle(matrix: List[List[chr]]) -> int:
'''
计算最大矩形
Args:
matrix: 矩形
Returns:
数量
'''
if matrix == None or len(matrix) < 1:
return 0
res = 0
m, n = len(matrix), len(matrix[0])
left = [0] * n
right = [0] * n
height = [0] * n
for i in range(m):
cur_left = 0
cur_right = n
for j in range(n):
if matrix[i][j] == '1':
height[j] += 1
else:
height[j] = 0
for j in range(n):
if matrix[i][j] == '1':
left[j] == max(left[j], cur_left)
else:
left[j] = 0
cur_left = j + 1
j1 = n - 1
while j1 >= 0:
if matrix[i][j1] == '1':
right[j1] = min(right[j1], cur_right)
else:
right[j1] = n
cur_right = j1
j1 -= 1
for j in range(n):
res = max(res, (right[j] - left[j]) * height[j])
return res
时间复杂度:O(n*m)
空间复杂度:O(m)
每一层看作是柱状图,可以套用84题柱状图的最大面积。
第一层柱状图的高度[“1”,”0”,”1”,”0”,”0”],最大面积为1;
第二层柱状图的高度[“2”,”0”,”2”,”1”,”1”],最大面积为3;
第三层柱状图的高度[“3”,”1”,”3”,”2”,”2”],最大面积为6;
第四层柱状图的高度[“4”,”0”,”0”,”3”,”0”],最大面积为4;
java实现方法2:
/**
* 计算最大矩形
*
* @param matrix 二维数组
* @return 矩形
*/
public int maximalRectangle2(char[][] matrix) {
if (matrix == null || matrix.length == 0) {
return 0;
}
int res = 0;
int m = matrix.length;
int n = matrix[0].length;
int[] height = new int[n];
for (int i = 0; i < m; i++) {
// 计算都为1矩形的高
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {
height[j]++;
} else {
height[j] = 0;
}
}
res = Math.max(res,largestRectangleHistogram(height) );
}
return res;
}
/**
* 计算数组最大面积(brute force)
*
* @param heights 高度数组
* @return 面积
*/
public int largestRectangleHistogram(int[] heights) {
int area = 0, n = heights.length;
// 遍历每个柱子,以当前柱子的高度作为矩形的高 h,
// 从当前柱子向左右遍历,找到矩形的宽度 w。
for (int i = 0; i < n; i++) {
int w = 1, h = heights[i], j = i;
while (--j >= 0 && heights[j] >= h) {
w++;
}
j = i;
while (++j < n && heights[j] >= h) {
w++;
}
area = Math.max(area, w * h);
}
return area;
}
时间复杂度:O(n*2)
空间复杂度:O(n)
python实现方法2:
def maximal_rectangle2(matrix: List[List[chr]]) -> int:
'''
计算最大矩形
Args:
matrix: 矩形
Returns:
数量
'''
if matrix == None or len(matrix) < 1:
return 0
res = 0
m, n = len(matrix), len(matrix[0])
heights = [0] * n
for i in range(m):
for j in range(n):
if matrix[i][j] == '1':
heights[j] += 1
else:
heights[j] = 0
res = max(res, largest_rectangle_histogram(heights))
return res
def largest_rectangle_histogram(heights: List[int]) -> int:
'''
计算最大矩形长度
Args:
heights: 数组长度
Returns:
矩形最大面积
'''
if not heights:
return 0
if len(heights) < 2:
return heights[0]
area_max = 0
for i in range(len(heights)):
height = heights[i]
width = 1 # 当前宽度为1
k = i - 1
while k >= 0 and heights[k] >= height:
width += 1
k -= 1
k = i + 1
while k <= len(heights) - 1 and heights[k] >= height:
width += 1
k += 1
area_max = max(area_max, height * width)
return area_max
时间复杂度:O(n*2)
空间复杂度:O(n)
源码github地址:
https://github.com/zhangyu345293721/leetcode
还没有评论,来说两句吧...