1. 程式人生 > 資訊 >運營商入局 5G 手機終端市場

運營商入局 5G 手機終端市場

技術標籤:演算法leetcode資料結構動態規劃java

221. 最大正方形

在一個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。

示例:

輸入:

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

輸出: 4

思路:動態規劃

思路參考: https://leetcode-cn.com/problems/maximal-square/solution/li-jie-san-zhe-qu-zui-xiao-1-by-lzhlyle/ dp[i][j]表示以(i,j)座標為右下角的最大正方形的邊長 轉態轉移方程為:dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1; 假設三者的正方形的邊長最小值為k,則
  • dp[i-1][j-1]表示以(i-1,j-1)座標為右下角的最大正方形的邊長,該正方形的上下區間和左右區間為(i-2-k,i-1)和(j-2-k,j-1)
  • dp[i-1][j]表示以(i-1,j)座標為右下角的最大正方形的邊長,該正方形的上下區間和左右區間為(i-2-k,i-1)和(j-1-k,j)
  • dp[i][j-1]表示以(i,j-1)座標為右下角的最大正方形的邊長,該正方形的上下區間和左右區間為(i-1-k,i)和(j-2-k,j-1)
把圖畫出來,可以看出如果剛好(i,j)座標為1,則可以形成一個變成為k+1的正方形 初識值為第一行和第一列的matrix[][]為1的單位dp[i][j]為1
 1 class Solution {
 2     public int maximalSquare(char[][] matrix) {
 3 
 4         if(matrix.length == 0 || matrix[0].length == 0){
 5             return 0;
 6         }
 7         int rows = matrix.length;
 8         int cols = matrix[0].length;
 9         int[][] dp = new int[rows][cols];
10 
11         int maxLenSide = 0;
12         for(int i = 0; i < rows; i++){
13             for(int j = 0; j < cols; j++){
14                 if(matrix[i][j] == '1'){
15                     if(i == 0 || j == 0){
16                         dp[i][j] = 1;       // 第一行和第一列的'1'的dp[i][j]都為1
17                     }else{
18                         dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;
19                     }
20                     maxLenSide = Math.max(maxLenSide, dp[i][j]);
21                 }
22             }
23         }
24         return maxLenSide * maxLenSide;
25     }
26 }
leetcode 執行用時:6 ms > 83.67%, 記憶體消耗:41.7 MB > 84.07%

複雜度分析:

時間複雜度:O(n*m)。遍歷了整個matrix[][], 所以時間複雜度為O(n*m)。 空間複雜度:O(n*m)。因為需要一個與matrix[][]等大小的二維陣列,所以空間複雜度也為O(n*m)。