zoukankan      html  css  js  c++  java
  • [LeetCode] 221. Maximal Square 最大正方形

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.

    For example, given the following matrix:

    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0
    

    Return 4. 

    Credits:
    Special thanks to @Freezen for adding this problem and creating all test cases.

    给一个2维的01矩阵,找出最大只含有1的正方形,返回它的面积。

    解法1: Brute force,对于矩阵中的每一个为1的点,都把它当作正方形的左上角,然后判断不同大小的正方形内的点是不是都为1。

    解法2: DP,对于第一种的解法肯定有很多的重复计算,所以可以用DP的方法,把某一点能组成的最大正方形记录下来。

    Python: DP

    class Solution:
        # @param {character[][]} matrix
        # @return {integer}
        def maximalSquare(self, matrix):
            if not matrix:
                return 0
    
            m, n = len(matrix), len(matrix[0])
            size = [[0 for j in xrange(n)] for i in xrange(m)]
            max_size = 0
            
            for j in xrange(n):
                if matrix[0][j] == '1':
                    size[0][j] = 1
                max_size = max(max_size, size[0][j])
                
            for i in xrange(1, m):
                if matrix[i][0] == '1':
                    size[i][0] = 1
                else:
                    size[i][0] = 0
                for j in xrange(1, n):
                    if matrix[i][j] == '1':
                        size[i][j] = min(size[i][j - 1],  
                                         size[i - 1][j],  
                                         size[i - 1][j - 1]) + 1
                        max_size = max(max_size, size[i][j])
                    else:
                        size[i][j] = 0
                        
            return max_size * max_size
    

    C++:

    class Solution {
    public:
        int maximalSquare(vector<vector<char>>& matrix) {
            if (matrix.empty() || matrix[0].empty()) return 0;
            int m = matrix.size(), n = matrix[0].size(), res = 0;
            vector<vector<int>> dp(m, vector<int>(n, 0));
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    if (i == 0 || j == 0) dp[i][j] = matrix[i][j] - '0';
                    else if (matrix[i][j] == '1') {
                        dp[i][j] = min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j])) + 1;
                    }
                    res = max(res, dp[i][j]);
                }
            }
            return res * res;
        }
    };
    

    C++:

    class Solution {
    public:
        int maximalSquare(vector<vector<char>>& matrix) {
            if (matrix.empty() || matrix[0].empty()) return 0;
            int m = matrix.size(), n = matrix[0].size(), res = 0, pre = 0;
            vector<int> dp(m + 1, 0);
            for (int j = 0; j < n; ++j) {
                for (int i = 1; i <= m; ++i) {
                    int t = dp[i];
                    if (matrix[i - 1][j] == '1') {
                        dp[i] = min(dp[i], min(dp[i - 1], pre)) + 1;
                        res = max(res, dp[i]);
                    } else {
                        dp[i] = 0;
                    }
                    pre = t;
                }
            }
            return res * res;
        }
    };
    

     

    All LeetCode Questions List 题目汇总

     

      

      

  • 相关阅读:
    List接口之ArrayList
    锁定线程:同步方法
    锁定线程:同步块
    通过Lambda表达式实现多线程
    通过实现Runnable接口来实现多线程
    通过继承Thread类实现多线程
    super关键字的经典案例
    Merge Two Sorted Lists
    Remove Element
    Remove Duplicates from Sorted List
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8614962.html
Copyright © 2011-2022 走看看