【ALGO】Leetcode 85.最大矩形
題面
原題連結
給定一個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。
解析
本題如果直接採用暴力列舉的解法,時間複雜度為
O
(
n
6
)
\mathcal{O}(n^6)
O(n6),考慮列舉下邊界加預處理進行時間複雜度優化.
列舉第
i
i
i行,設第
i
i
i行第
j
j
j列的向上連續的1的個數為
f
(
i
,
j
)
f(i, j)
f(i,j),則
f
(
i
,
j
)
=
{
0
,
m
a
t
r
i
x
(
i
,
j
)
=
0
1
+
f
(
i
−
1
,
j
)
,
m
a
t
r
i
x
(
i
,
j
)
=
1
f(i, j)= \begin{cases} 0, matrix(i, j)=0\\ 1+f(i-1, j), matrix(i, j)=1 \end{cases}
f(i,j)={0,matrix(i,j)=01+f(i−1,j),matrix(i,j)=1
然後問題可以轉化為Leetcode 84.柱狀圖中最大矩形求解.
AC程式碼
class Solution {
private:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
vector<int> left(n), right(n);
stack<int> st; // 儲存下標的單調棧
// left->right sweep
for(int i=0; i<n; ++i){
while(!st.empty() && heights[st.top()]>=heights[i]) st.pop();
if(st.empty()) left[i]=-1;
else left[i]=st.top();
st.push(i);
}
st = stack<int>();
// right->left sweep
for(int i=n-1; ~i; --i){
while(!st.empty() && heights[st.top()]>=heights[i]) st.pop();
if(st.empty()) right[i]=n;
else right[i]=st.top();
st.push(i);
}
int ans=0;
for(int i=0; i<n; ++i){
ans=max(ans, heights[i]*(right[i]-left[i]-1));
// cout<<heights[i]<<" "<<left[i]<<" "<<right[i]<<endl;
}
return ans;
}
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty() || matrix[0].empty()) return 0;
int n = matrix.size(), m=matrix[0].size();
vector<vector<int>> f(n, vector<int>(m)); // 上方有多少個連續的1
for(int i=0; i<n; ++i)
for(int j=0; j<m; ++j){
if(matrix[i][j]=='1' && i) f[i][j]=1+f[i-1][j];
else if(matrix[i][j]=='1') f[i][j]=1;
else f[i][j]=0;
}
int ans = 0;
for(int i=0; i<n; ++i) ans=max(ans, largestRectangleArea(f[i])); // 列舉下邊界
return ans;
}
};
相關文章
- LeetCode_84.柱狀圖中最大的矩形LeetCode
- leetcode:求直方圖構成的矩形最大面積LeetCode直方圖
- 【ALGO】Leetcode 97.交錯字串GoLeetCode字串
- 【ALGO】Leetcode 91.解碼方法GoLeetCode
- 直方圖中最大矩形直方圖
- opencv 最大內接矩形筆記OpenCV筆記
- Google賽馬;及最大矩形分析Go
- 最大矩形;及第n杯水分析
- P1719 最大加權矩形
- HISTOGRA - 最大矩形面積(單調棧)
- 單調棧進階-接雨水-最大矩形
- 【ALGO】Leetcode 98.驗證二叉搜尋樹GoLeetCode
- Java 演算法-最大矩形(動態規劃)Java演算法動態規劃
- 力扣LCR 039. 柱狀圖中最大的矩形力扣
- LeetCode-179-最大數LeetCode
- leetcode_最大子序和LeetCode
- 《STL原始碼剖析》 -- stl_algo.h原始碼Go
- 力扣85-最大矩形(巧妙利用上一題解答 Java版題解)力扣Java
- [Leetcode]895.最大頻率棧LeetCode
- LeetCode 164 最大間距 HERODING的LeetCode之路LeetCode
- leetcode 152 乘積最大子序列LeetCode
- [Leetcode] Maximum Gap 相鄰最大差值LeetCode
- LeetCode53. 最大子陣列和LeetCode陣列
- 【Leetcode刷題篇】leetcode152 乘積最大陣列LeetCode陣列
- Leetcode 559. N叉樹的最大深度LeetCode
- LeetCode654. 最大二叉樹LeetCode二叉樹
- canvas 繪製矩形Canvas
- canvas 虛線矩形Canvas
- AUTOCAD——矩形命令
- canvas矩形拖拽效果Canvas
- Code Review Swift 演算法題: 最小面積矩形 Leetcode 的動人之處ViewSwift演算法LeetCode
- LeetCode-485-最大連續 1 的個數LeetCode
- LeetCode-152-乘積最大子陣列LeetCode陣列
- LeetCode 410——分割陣列的最大值LeetCode陣列
- 【Leetcode】152.乘積最大子陣列LeetCode陣列
- 【LeetCode】每日一題164. 最大間距LeetCode每日一題
- LeetCode 239. 滑動視窗最大值LeetCode
- 【刷演算法】LeetCode.53-最大子序和演算法LeetCode