💢欢迎来到张翊尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥
文章目录
- 算法每日一练 (23)
- 最大正方形
- 题目描述
- 解题思路
- 解题代码
- `c/c++`
- `golang`
- `lua`
官方站点: 力扣 Leetcode
算法每日一练 (23)
最大正方形
题目地址:最大正方形
题目描述
在一个由 '0'
和 '1'
组成的二维矩阵内,找到只包含 '1'
的最大正方形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4
示例 2:
输入:matrix = [["0","1"],["1","0"]]
输出:1
示例 3:
输入:matrix = [["0"]]
输出:0
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j]
为'0'
或'1'
解题思路
-
首先创建辅助变量:
m
、n
、maxVal
、dp
:m
和n
分别表示矩阵的行数和列数。maxVal
用于记录矩阵中最大的正方形边长,初始值为 0。dp
用于记录当前行的正方形边长。
-
紧接着,遍历矩阵的第一行,更新
maxVal
和dp[i]
的值。这是因为第一行中的每个'1'
都可以构成一个边长为 1 的正方形。 -
从第二行开始,遍历矩阵的每个位置
(i, j)
,对于每一行的每个元素:- 如果是第一列(
j == 0
),直接将当前元素的值赋给dp[j]
即可。 - 否则,根据动态规划的逻辑更新
dp[j]
:- 如果当前元素是
'0'
,则dp[j]
为0
,因为无法形成正方形。 - 如果当前元素是
'1'
,则dp[j]
的值为:当前元素的上方(up
)、左方(left
)和左上方(lup
)三个值的最小值加1
。这是因为正方形的形成需要依赖于其上方、左方和左上方的正方形边长。
- 如果当前元素是
- 如果是第一列(
-
更新
maxVal
为当前列的最大值。 -
最终返回
maxVal
的平方,即是满足题意的返回值。
解题代码
c/c++
#include <vector>
class Solution
{
public:
int maximalSquare(std::vector<std::vector<char>> &matrix)
{
int m = matrix.size();
int n = matrix[0].size();
int maxVal = 0;
std::vector<int> dp(n, 0);
for (int i = 0; i < n; i++)
{
dp[i] = matrix[0][i] - '0';
maxVal = std::max(maxVal, dp[i]);
}
for (int i = 1; i < m; i++)
{
int prev = dp[0];
for (int j = 0; j < n; j++)
{
int cur = matrix[i][j] - '0';
if (j == 0)
dp[j] = cur;
else
{
int t = dp[j];
if (matrix[i][j] == '0')
dp[j] = 0;
else
{
int up = t;
int left = dp[j - 1];
int lup = prev;
dp[j] = std::min(std::min(up, left), lup) + 1;
}
prev = t;
}
maxVal = std::max(maxVal, dp[j]);
}
}
return maxVal * maxVal;
}
};
golang
func maximalSquare(matrix [][]byte) int {
m := len(matrix)
n := len(matrix[0])
maxVal := 0
dp := make([]int, n)
for i := 0; i < n; i++ {
dp[i] = int(matrix[0][i] - '0')
maxVal = max(maxVal, dp[i])
}
for i := 1; i < m; i++ {
prev := dp[0]
for j := 0; j < n; j++ {
cur := int(matrix[i][j] - '0')
if j == 0 {
dp[j] = cur
} else {
t := dp[j]
if matrix[i][j] == '0' {
dp[j] = 0
} else {
up, left, lup := t, dp[j-1], prev
dp[j] = min(up, left, lup) + 1
}
prev = t
}
maxVal = max(maxVal, dp[j])
}
}
return maxVal * maxVal
}
lua
local function maximalSquare(matrix)
local m, n = #matrix, #matrix[1]
local maxVal = 0
local dp = {}
for i = 1, n do
dp[i] = matrix[1][i] - '0'
maxVal = math.max(maxVal, dp[i])
end
for i = 2, m do
local prev = dp[1]
for j = 1, n do
local cur = matrix[i][j] - '0'
if j == 1 then
dp[j] = cur
else
local t = dp[j]
if matrix[i][j] == '0' then
dp[j] = 0
else
local up, left, lup = t, dp[j - 1], prev
dp[j] = math.min(up, left, lup) + 1
end
prev = t
end
maxVal = math.max(maxVal, dp[j])
end
end
return maxVal * maxVal
end
🌺🌺🌺撒花!
如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。