1. 程式人生 > 其它 >leetcode 最大正方形 中等

leetcode 最大正方形 中等

有兩種方法:

① 二分 + 字首和。列舉每個點作為起點,二分正方形邊長,利用字首和判斷當前的正方形是否全 1 即可。

② 單調棧。有一個最大全 1 的矩形題目,而最大正方形肯定被最大矩形包含,假設最大矩形長寬為 a, b,那麼每一次找到的一個當前行的最大矩形時,ans = max(ans, min(a, b)).

最大全 1 矩形參考:https://blog.csdn.net/zuzhiang/article/details/78693421

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        
if(matrix.empty() || matrix[0].empty()) return 0; vector<vector<int>> height(matrix.size()); for(auto &item : height) { item.resize(matrix[0].size(), 0); } for(int i = 0; i < height.size(); ++ i) { for(int j = 0; j < height[0].size(); ++ j) {
if(matrix[i][j] == '0') continue; height[i][j] = i > 0 ? height[i - 1][j] + 1 : 1; } } int ans = 0; stack<int> stk; for(int i = 0; i < height.size(); ++ i) { while(!stk.empty()) stk.pop(); height[i].emplace_back(
0); for(int j = 0; j < height[i].size(); ++ j) { if(stk.empty() || height[i][stk.top()] <= height[i][j]) { stk.push(j); continue; } int lef, rig = j - 1; while(!stk.empty() && height[i][stk.top()] > height[i][j]) { lef = stk.top(); stk.pop(); ans = max(ans, min(rig - lef + 1, height[i][lef])); } height[i][lef] = height[i][j]; stk.push(lef); } } return ans * ans; } };