当前位置: 首页 > news >正文

算法每日一练 (23)

💢欢迎来到张翊尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • 算法每日一练 (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'

解题思路

  • 首先创建辅助变量:mnmaxValdp

    • mn 分别表示矩阵的行数和列数。
    • maxVal 用于记录矩阵中最大的正方形边长,初始值为 0。
    • dp 用于记录当前行的正方形边长。
  • 紧接着,遍历矩阵的第一行,更新 maxValdp[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

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述

http://www.dtcms.com/a/100037.html

相关文章:

  • 深入理解 Windows 进程管理:taskkill 命令详解
  • 《电子武林争霸赛:MOSFET少侠 vs 三极管长老》
  • axios使用
  • 网络空间安全(44)Web实战篇
  • 硬件学习笔记--56 电击防护方式分类介绍
  • 目标检测中COCO评估指标中每个指标的具体含义说明:AP、AR
  • 基于YOLOv8的PCB缺陷检测--补充实验
  • [C++面试] 智能指针面试点(重点)续3
  • 【视觉提示学习】3.28阅读随想
  • 11. STL的使用
  • springBoot统一响应类型3.4版本
  • LlamaIndex实现(基于PDF|CSV文件)RAG检索增强生成:NaiveRAG
  • 量子计算:未来计算技术的革命性突破
  • 【奶茶经济学的符号暴力本质】
  • 【软件开发】可复用的数据库导入工具类
  • J2EE框架技术 第五章 Spring注入与作用域
  • 【C++】STL库_stack_queue 的模拟实现
  • 【leetcode】通过两种遍历方式构造二叉树
  • 前端页面缓存问题
  • opencv之指纹验证
  • spring-security原理与应用系列:securityFilterChainBuilders
  • 职测-言语理解与表达
  • SD-WAN组网方案
  • pycharm相对路径引用方法
  • C++ 多态:面向对象编程的核心概念(一)
  • Android Product Flavors 深度解析与最佳实践:构建多版本应用的全方位指南
  • Redis的补充和RESP
  • 【工具】BioPred一个用于精准医疗中生物标志物分析的 R 软件包
  • C# StreamReader/StreamWriter 使用详解
  • 什么是 RBAC 权限模型?