刷題40-最大矩形面積
原題連結
題目描述
給出一個只包含0和1的二維矩陣,找出最大的全部元素都是1的長方形區域,
返回該區域的面積。
示例
輸入:
matrix = [
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
輸出:6
解釋:最大矩形如上圖所示。
解析
每一層加上上面的層,將他們看作是柱狀圖。
第一層柱狀圖的高度["1","0","1","0","0"],最大面積為1;
第二層及以上柱狀圖的高度["2","0","2","1","1"],最大面積為3;
第三層及以上柱狀圖的高度["3","1","3","2","2"],最大面積為6;
第四層及以上柱狀圖的高度["4","0","0","3","0"],最大面積為4;
然後將題目轉換成求直方圖的最大面積
每遍歷一層都有一個直方圖
參考程式碼
public class Solution {
public int maximalRectangle(char[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
int col = matrix.length;
int row = matrix[0].length;
int[] heights = new int[row];
int ans = 0;
for (int i = 0; i < col; i++) {
for (int j = 0; j < row; j++) {
// 原陣列是char型別的
if (matrix[i][j] == '1') {
heights[j] += 1;
} else {
heights[j] = 0;
}
}
// 將每一行及上面的行,當作求解直方圖的最大矩形面積
ans = Math.max(ans, largestRectangleArea(heights));
}
return ans;
}
public int largestRectangleArea(int[] heights) {
int area = 0, n = heights.length;
// 遍歷每個柱子,以當前柱子的高度作為矩形的高 h,
// 從當前柱子向左右遍歷,找到矩形的寬度 w。
for (int i = 0; i < n; i++) {
int w = 1, h = heights[i];
if(h==0)
continue;
// 從i-1到heights[]左側的邊界
int j= i - 1;
// 如果有柱子比當前高度矮,則迴圈中斷
while (j >= 0 && heights[j] >= h) {
w++;
j--;
}
// 從i+1到height[]右側的邊界
j = i + 1;
// 如果有柱子比當前高度矮,則迴圈中斷
while (j < n && heights[j] >= h) {
w++;
j++;
}
area = Math.max(area, w * h);
}
return area;
}
}
相關文章
- HISTOGRA - 最大矩形面積(單調棧)
- 【Leetcode刷題篇】leetcode812 最大三角形面積LeetCode
- 求矩形周長與面積
- Leetcode刷題628. 三個數的最大乘積LeetCode
- 【Leetcode刷題篇】leetcode152 乘積最大陣列LeetCode陣列
- 最大島嶼面積
- 力扣.223 矩形面積 rectangle-area力扣
- CAD如何繪製固定面積的矩形
- leetcode:求直方圖構成的矩形最大面積LeetCode直方圖
- 【題解】A23330.最大四邊形面積
- 最大加權矩形
- Code Review Swift 演算法題: 最小面積矩形 Leetcode 的動人之處ViewSwift演算法LeetCode
- [藍橋杯][基礎練習VIP]矩形面積交
- 【ALGO】Leetcode 85.最大矩形GoLeetCode
- 直方圖中最大矩形直方圖
- 藍橋杯刷題-乘積尾零
- P1719 最大加權矩形
- opencv 最大內接矩形筆記OpenCV筆記
- 面試刷題總結面試
- 程式設計師的數學思維:如何推導矩形面積程式設計師
- 力扣85-最大矩形(巧妙利用上一題解答 Java版題解)力扣Java
- 演算法題:乘積最大子序列演算法
- 面試刷題偶有記錄面試
- 84. 柱狀圖中最大的矩形
- 單調棧進階-接雨水-最大矩形
- 【刷題筆記】LeetCode-53 最大子陣列和筆記LeetCode陣列
- LeetCode_84.柱狀圖中最大的矩形LeetCode
- Leetcode刷題面試題 16.14. 最佳直線LeetCode面試題
- 後面試時代與 AI 刷題面試AI
- 測試面試題-積累篇面試題
- LeetCode 面試題16.07[最大數值]LeetCode面試題
- 【LeetCode刷題(中等程度)】662. 二叉樹最大寬度LeetCode二叉樹
- LeetCode每日一題: 三個數的最大乘積(No.628)LeetCode每日一題
- 力扣LCR 039. 柱狀圖中最大的矩形力扣
- 刷題
- 【DP】乘積最大子陣列陣列
- 三個數的最大乘積
- leetcode 152 乘積最大子序列LeetCode