leetcode 85. Maximal Rectangle | 85. 最大矩形(单调栈)

男娘i 2022-09-11 11:23 212阅读 0赞

题目

https://leetcode.com/problems/maximal-rectangle/
在这里插入图片描述

题解

本题与 leetcode 84. Largest Rectangle in Histogram | 84. 柱状图中最大的矩形(单调栈) 思路相同,直接抄了原来的代码。

也可参考之前的博客:左神算法:求最大子矩阵的大小(Java版)

另外,想到了另外一道类似但思路不同的题:221. Maximal Square

  1. class Solution {
  2. public int maximalRectangle(char[][] matrix) {
  3. if (matrix.length == 0) return 0;
  4. int M = matrix.length;
  5. int N = matrix[0].length;
  6. int[][] heights = new int[M][N]; // 上方有多少个连续的1
  7. for (int i = 0; i < N; i++) {
  8. heights[0][i] = matrix[0][i] - '0';
  9. for (int j = 1; j < M; j++) {
  10. if (matrix[j][i] == '1') heights[j][i] = heights[j - 1][i] + 1;
  11. else heights[j][i] = 0;
  12. }
  13. }
  14. int result = 0;
  15. for (int i = 0; i < M; i++) {
  16. result = Math.max(largestRectangleArea(heights[i]), result);
  17. }
  18. return result;
  19. }
  20. // leetcode 84. Largest Rectangle in Histogram
  21. public int largestRectangleArea(int[] heights) {
  22. int L = heights.length;
  23. // 找左边第一个小于h[i]的数
  24. // 从右向左遍历,维护单调不减栈,小数h[i]不断将大数h[j]弹出,则h[i]左边第一个小于h[i]的数为h[j]
  25. Stack<Integer> valueStack = new Stack<>();
  26. Stack<Integer> indexStack = new Stack<>();
  27. int[] leftIndex = new int[L]; // i左边第一个小于i的数的下标
  28. Arrays.fill(leftIndex, -1);
  29. for (int i = L - 1; i >= 0; i--) {
  30. while (!valueStack.isEmpty() && valueStack.peek() > heights[i]) {
  31. leftIndex[indexStack.pop()] = i;
  32. valueStack.pop();
  33. }
  34. valueStack.push(heights[i]);
  35. indexStack.push(i);
  36. }
  37. // 找右边第一个小于h[i]的数
  38. // 从左向右遍历,维护单调不减栈
  39. valueStack = new Stack<>();
  40. indexStack = new Stack<>();
  41. int[] rightIndex = new int[L]; // i右边第一个小于i的数的下标
  42. Arrays.fill(rightIndex, L);
  43. for (int i = 0; i < L; i++) {
  44. while (!valueStack.isEmpty() && valueStack.peek() > heights[i]) {
  45. rightIndex[indexStack.pop()] = i;
  46. valueStack.pop();
  47. }
  48. valueStack.push(heights[i]);
  49. indexStack.push(i);
  50. }
  51. // 对于每个h[i],以其自身的高度,分别向左右扩张
  52. int maxArea = 0;
  53. for (int i = 0; i < L; i++) {
  54. maxArea = Math.max(maxArea, (rightIndex[i] - leftIndex[i] - 1) * heights[i]);
  55. }
  56. return maxArea;
  57. }
  58. }

在这里插入图片描述

发表评论

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

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

相关阅读