LeetCode:85. Maximal Rectangle(最大的矩形)

Bertha 。 2022-04-10 02:26 362阅读 0赞

文章最前: 我是Octopus,这个名字来源于我的中文名—章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. LeetCode:55. Jump Game(跳远比赛)
  2. Leetcode:300. Longest Increasing Subsequence(最大增长序列)
  3. 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. [
  2. ["1","0","1","0","0"],
  3. ["1","0","1","1","1"],
  4. ["1","1","1","1","1"],
  5. ["1","0","0","1","0"]
  6. ]

输出: 6

来源:力扣(LeetCode)


java实现方法1:

  1. /**
  2. * 计算最大矩形
  3. *
  4. * @param matrix 二维数组
  5. * @return 矩形
  6. */
  7. public int maximalRectangle(char[][] matrix) {
  8. if (matrix == null || matrix.length == 0) {
  9. return 0;
  10. }
  11. int res = 0;
  12. int m = matrix.length;
  13. int n = matrix[0].length;
  14. int[] left = new int[n];
  15. int[] right = new int[n];
  16. int[] height = new int[n];
  17. Arrays.fill(right, n);
  18. for (int i = 0; i < m; i++) {
  19. int curleft = 0, curright = n;
  20. for (int j = 0; j < n; j++) {
  21. if (matrix[i][j] == '1') {
  22. height[j]++;
  23. } else {
  24. height[j] = 0;
  25. }
  26. }
  27. for (int j = 0; j < n; j++) {
  28. if (matrix[i][j] == '1') {
  29. left[j] = Math.max(left[j], curleft);
  30. } else {
  31. left[j] = 0;
  32. curleft = j + 1;
  33. }
  34. }
  35. for (int j = n - 1; j >= 0; j--) {
  36. if (matrix[i][j] == '1') {
  37. right[j] = Math.min(right[j], curright);
  38. } else {
  39. right[j] = n;
  40. curright = j;
  41. }
  42. }
  43. for (int j = 0; j < n; j++) {
  44. res = Math.max(res, (right[j] - left[j]) * height[j]);
  45. }
  46. }
  47. return res;
  48. }

时间复杂度:O(n*m)

空间复杂度:O(m)


python实现方法1:

  1. def maximal_rectangle(matrix: List[List[chr]]) -> int:
  2. '''
  3. 计算最大矩形
  4. Args:
  5. matrix: 矩形
  6. Returns:
  7. 数量
  8. '''
  9. if matrix == None or len(matrix) < 1:
  10. return 0
  11. res = 0
  12. m, n = len(matrix), len(matrix[0])
  13. left = [0] * n
  14. right = [0] * n
  15. height = [0] * n
  16. for i in range(m):
  17. cur_left = 0
  18. cur_right = n
  19. for j in range(n):
  20. if matrix[i][j] == '1':
  21. height[j] += 1
  22. else:
  23. height[j] = 0
  24. for j in range(n):
  25. if matrix[i][j] == '1':
  26. left[j] == max(left[j], cur_left)
  27. else:
  28. left[j] = 0
  29. cur_left = j + 1
  30. j1 = n - 1
  31. while j1 >= 0:
  32. if matrix[i][j1] == '1':
  33. right[j1] = min(right[j1], cur_right)
  34. else:
  35. right[j1] = n
  36. cur_right = j1
  37. j1 -= 1
  38. for j in range(n):
  39. res = max(res, (right[j] - left[j]) * height[j])
  40. 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:

  1. /**
  2. * 计算最大矩形
  3. *
  4. * @param matrix 二维数组
  5. * @return 矩形
  6. */
  7. public int maximalRectangle2(char[][] matrix) {
  8. if (matrix == null || matrix.length == 0) {
  9. return 0;
  10. }
  11. int res = 0;
  12. int m = matrix.length;
  13. int n = matrix[0].length;
  14. int[] height = new int[n];
  15. for (int i = 0; i < m; i++) {
  16. // 计算都为1矩形的高
  17. for (int j = 0; j < n; j++) {
  18. if (matrix[i][j] == '1') {
  19. height[j]++;
  20. } else {
  21. height[j] = 0;
  22. }
  23. }
  24. res = Math.max(res,largestRectangleHistogram(height) );
  25. }
  26. return res;
  27. }
  28. /**
  29. * 计算数组最大面积(brute force)
  30. *
  31. * @param heights 高度数组
  32. * @return 面积
  33. */
  34. public int largestRectangleHistogram(int[] heights) {
  35. int area = 0, n = heights.length;
  36. // 遍历每个柱子,以当前柱子的高度作为矩形的高 h,
  37. // 从当前柱子向左右遍历,找到矩形的宽度 w。
  38. for (int i = 0; i < n; i++) {
  39. int w = 1, h = heights[i], j = i;
  40. while (--j >= 0 && heights[j] >= h) {
  41. w++;
  42. }
  43. j = i;
  44. while (++j < n && heights[j] >= h) {
  45. w++;
  46. }
  47. area = Math.max(area, w * h);
  48. }
  49. return area;
  50. }

时间复杂度:O(n*2)

空间复杂度:O(n)


python实现方法2:

  1. def maximal_rectangle2(matrix: List[List[chr]]) -> int:
  2. '''
  3. 计算最大矩形
  4. Args:
  5. matrix: 矩形
  6. Returns:
  7. 数量
  8. '''
  9. if matrix == None or len(matrix) < 1:
  10. return 0
  11. res = 0
  12. m, n = len(matrix), len(matrix[0])
  13. heights = [0] * n
  14. for i in range(m):
  15. for j in range(n):
  16. if matrix[i][j] == '1':
  17. heights[j] += 1
  18. else:
  19. heights[j] = 0
  20. res = max(res, largest_rectangle_histogram(heights))
  21. return res
  22. def largest_rectangle_histogram(heights: List[int]) -> int:
  23. '''
  24. 计算最大矩形长度
  25. Args:
  26. heights: 数组长度
  27. Returns:
  28. 矩形最大面积
  29. '''
  30. if not heights:
  31. return 0
  32. if len(heights) < 2:
  33. return heights[0]
  34. area_max = 0
  35. for i in range(len(heights)):
  36. height = heights[i]
  37. width = 1 # 当前宽度为1
  38. k = i - 1
  39. while k >= 0 and heights[k] >= height:
  40. width += 1
  41. k -= 1
  42. k = i + 1
  43. while k <= len(heights) - 1 and heights[k] >= height:
  44. width += 1
  45. k += 1
  46. area_max = max(area_max, height * width)
  47. return area_max

时间复杂度:O(n*2)

空间复杂度:O(n)


源码github地址:

https://github.com/zhangyu345293721/leetcode

发表评论

表情:
评论列表 (有 0 条评论,362人围观)

还没有评论,来说两句吧...

相关阅读