力扣85-最大矩形(巧妙利用上一題解答 Java版題解)
力扣85-最大矩形
一、原題題目
1.1 題目
給定一個僅包含 0
和 1
、大小為 rows x cols
的二維二進位制矩陣,找出只包含 1
的最大矩形,並返回其面積。
1.2 示例
-
示例1:
輸入: matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
輸出: 6
解釋: 最大矩形如上圖所示。 -
示例2:
輸入: matrix = []
輸出: 0 -
示例3:
輸入: matrix = [[“0”]]
輸出: 0 -
示例4:
輸入: matrix = [[“1”]]
輸出: 1 -
示例5:
輸入: matrix = [[“0”,“0”]]
輸出: 0
提示:
row == matrix.length
cols == matrix[0].length
0 <= row, cols <= 200
matrix[i][j]
為0
或1
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/maximal-rectangle/
二、解題思路
- 解題思路
這個題基於力扣第84題-柱狀圖中最大的矩形可以比較容易的想到思路,我們可以一行一行的考慮最大的矩形,如圖所示。利用上一題的思路還是很容易想到解題思路的。
- 詳細程式碼(Java)
public int maximalRectangle(char[][] matrix) {
if(matrix.length == 0|| matrix == null) return 0; // 當字元二維陣列不存在輸出0
int[] a = new int[matrix[0].length]; // 記錄每一行中每一個位置向上連續1的個數
int max = 0; // 記錄最大的矩形面積,初始化為0
for (int i = 0;i<matrix.length;i++){ // 遍歷每一行
for (int j = 0;j<matrix[0].length;j++){ // 統計每一個位置向上連續1的個數
int count = 0; // 每一個位置初始化向上連續1的個數為0
for (int k = i;k>=0;k--){ // 向上遍歷
if (matrix[k][j]=='1')count++;
else break;
}
a[j] = count;
}
max = Math.max(max,largestRectangleArea(a));
}
return max;
}
// 第84題-柱狀圖中最大的矩形
public int largestRectangleArea(int[] heights) {
if (heights == null || heights.length==0) return 0; // 陣列為空返回0
int len = heights.length; // 記錄長度
int Smax = 0; // 記錄最大面積
Deque<Integer> stack = new ArrayDeque<>(len);
for (int i =0;i<len;i++){ // 遍歷每一個元素
// 棧不為空,且當前元素小於棧頂元素,則計算棧頂元素能勾勒矩形的面積
while (!stack.isEmpty()&&heights[i]<heights[stack.peekLast()]){
int right = i; // 右邊界為當前下標
int height = heights[stack.pollLast()]; // 棧頂出棧記錄高度
int left = stack.isEmpty()?-1:stack.peekLast(); // 左邊界:棧不空則為棧頂元素,否則為-1
Smax = Math.max(Smax,height*(right-left-1)); // 計算面積比較
}
stack.addLast(i); // 棧頂元素不大於當前值,入棧
}
while (!stack.isEmpty()){ // 遍歷完了陣列
int right = len; // 右邊界為陣列長度
int height = heights[stack.pollLast()]; // 棧頂出棧記錄高度
int left = stack.isEmpty()?-1:stack.peekLast(); // 左邊界:棧不空則為棧頂元素,否則為-1
Smax = Math.max(Smax,height*(right-left-1)); // 計算面積比較
}
return Smax;
}
- 程式碼執行結果
三、總結
這兩天的題目都是困難,做的很吃力,這個題就先這樣做著吧,後面有精力在分析多方法。
相關文章
- 力扣題解力扣
- 力扣LCR 039. 柱狀圖中最大的矩形力扣
- 力扣題解1-兩數之和力扣
- 力扣題解2-兩數相加力扣
- 刷題40-最大矩形面積
- 力扣.223 矩形面積 rectangle-area力扣
- leetcode 掃描線專題 06-leetcode.391 perfect-rectangle 力扣.391 完美矩形LeetCode力扣
- Java習題解答12Java
- leetcode 掃描線專題 06-leetcode.836 rectangle-overlap 力扣.836 矩形重疊LeetCode力扣
- 力扣題之迴文數力扣
- 字典序的下一個排序--力扣每日一題排序力扣每日一題
- python力扣刷題記錄——1614. 括號的最大巢狀深度Python力扣巢狀
- 力扣 204. 計數質數(每日一題)力扣每日一題
- 20201007:力扣209週週賽題解記錄(上)力扣
- 一道題把我氣笑了:) 力扣.53 最大子陣列和 leetcode maximum-subarray力扣陣列LeetCode
- 力扣題解-387. 字串中的第一個唯一字元力扣字串字元
- 力扣刷題——3007.價值和小於等於 K 的最大數字力扣
- 【力扣】排列問題(回溯法)(去重)力扣
- 力扣刷題——2306. 公司命名力扣
- 2024.09.22 力扣刷題 Z字形變換力扣
- 力扣刷題:100. 相同的樹力扣
- 力扣 面試題 17.16. 按摩師力扣面試題
- 力扣刷題-二分查詢力扣
- 力扣刷題-滑動視窗(字串)力扣字串
- Java應用上雲後被kill問題分析與解決Java
- 力扣前1500道非會員題刷題筆記力扣筆記
- 劍指 Offer 63. 股票的最大利潤-Python題解Python
- Leetcode 題解系列 -- 股票的最大利潤(動態規劃)LeetCode動態規劃
- 【每日一題】力扣1046.最後一塊石頭的重量每日一題力扣
- 力扣演算法經典第一題——兩數之和(Java兩種方式實現)力扣演算法Java
- 力扣485. 最大連續1的個數-C語言實現-簡單題力扣C語言
- 【力扣】最大子陣列和(貪心)力扣陣列
- 題解1232:查詢最大元素 (Java描述)Java
- 第 178 場力扣周賽 第二題力扣
- 力扣刷題Python筆記:括號生成力扣Python筆記
- 【每週例題】力扣 C++ 字串相乘力扣C++字串
- Java程式設計之道:巧妙解決Excel公式迭代計算難題Java程式設計Excel公式
- Hetao P1156 最大戰力 題解 [ 綠 ][ 二分 ][ 最大子段和 ]