Skip to content

Latest commit

 

History

History
115 lines (115 loc) · 4.14 KB

File metadata and controls

115 lines (115 loc) · 4.14 KB

题目描述:
image
解决过程:
用的最小栈,吐了,居然忘记怎么写了,花了40分钟。而且审题出了问题,以为是最大矩形来着,没想到是最大正方形
代码:(最小栈→暴力→动态规划)

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        vector<vector<int>> left (m, vector<int> (n));
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == '1') {
                    left[i][j] = (j > 0) ? left[i][j-1] + 1 : 1;
                }
            }
        }
        vector<vector<int>> up (n,vector<int> (m,-1)), down (n,vector<int> (m,m));
        for (int i = 0; i < n; i++) {
            stack<int> stk;
            for (int j = 0; j < m; j++) {
                while (!stk.empty() && left[stk.top()][i] > left[j][i]) {
                    down[i][stk.top()] = j;
                    stk.pop();
                }
                up[i][j] = (stk.empty()) ? -1 : stk.top();
                stk.push(j);
            }
        }
        int ans = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == '1') {
                    int width = left[i][j];
                    int hight = down[j][i] - up[j][i] - 1;
                    if (width > hight) width -= width - hight;
                    else if (width < hight) hight -= hight - width;
                    ans = max(ans, width * hight);
                }
            }
        }
        return ans;
    }
};
class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return 0;
        }
        int maxSide = 0;
        int rows = matrix.size(), columns = matrix[0].size();
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                if (matrix[i][j] == '1') {
                    // 遇到一个 1 作为正方形的左上角
                    maxSide = max(maxSide, 1);
                    // 计算可能的最大正方形边长
                    int currentMaxSide = min(rows - i, columns - j);
                    for (int k = 1; k < currentMaxSide; k++) {
                        // 判断新增的一行一列是否均为 1
                        bool flag = true;
                        if (matrix[i + k][j + k] == '0') {
                            break;
                        }
                        for (int m = 0; m < k; m++) {
                            if (matrix[i + k][j + m] == '0' || matrix[i + m][j + k] == '0') {
                                flag = false;
                                break;
                            }
                        }
                        if (flag) {
                            maxSide = max(maxSide, k + 1);
                        } else {
                            break;
                        }
                    }
                }
            }
        }
        int maxSquare = maxSide * maxSide;
        return maxSquare;
    }
};
class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return 0;
        }
        int maxSide = 0;
        int rows = matrix.size(), columns = matrix[0].size();
        vector<vector<int>> dp(rows, vector<int>(columns));
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                if (matrix[i][j] == '1') {
                    if (i == 0 || j == 0) {
                        dp[i][j] = 1;
                    } else {
                        dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
                    }
                    maxSide = max(maxSide, dp[i][j]);
                }
            }
        }
        int maxSquare = maxSide * maxSide;
        return maxSquare;
    }
};