C++ 中所有 1 的最大正方形子矩阵2025年3月17日 | 阅读 7 分钟 在本文中,您将学习如何在 C++ 中找到一个所有元素都为 1 的最大正方形子矩阵。 问题陈述给定一个二维矩阵,您必须搜索一个所有元素都为 1 的最大尺寸矩阵。 输入格式 一个 n X m 阶的二维矩阵。 输出格式 一个整数,表示最大尺寸矩阵的面积。 这意味着最大尺寸矩阵中所有 1 的总和。 例如解释如下矩阵是 {{'1', '0', '1', '0', '0'}, {'1', '0', '1', '1', '1'}, {'1', '1', '1', '1', '1'}, {'1', '0', '0', '1', '0'}} 输出 4 最大尺寸矩阵是{{'1', '1'}, {'1', '1'}} 方法 1:暴力法让我们举一个例子,在 C++ 中使用暴力法找到全为 1 的最大正方形子矩阵。 输出 ![]() 说明 上述程序用于查找大小为 n 或 n X n 阶的子矩阵。这是一种暴力法,其主要思想或思维过程是遍历矩阵。首先,取固定大小为 2 的子矩阵,并将其向右滑动,直到它到达矩阵的末尾。如果它们水平到达矩阵的末尾,则将该子矩阵向下移动一步,然后从起始位置再次滑动到矩阵的末尾。它形成一个固定大小为 2 X 2 阶的矩阵。 之后,改变子矩阵的阶数;将其改为3 X 3。再次,对所有不同大小的子矩阵执行相同的过程。当不再生成子矩阵时,它将结束。在这里,您在遍历或滑动矩阵时必须做一件事:检查矩阵中存在的所有元素是否都是 1。如果所有元素都是 1,则将矩阵的大小存储在一个变量中。每次您获得一个大小大于该变量的子矩阵时,您都会使用一个新大小更新变量的值,其中每个大小的矩阵都只包含 1。完成所有这些过程后,打印您存储的变量。它将为您提供所需的输出。此方法可能更优化。它需要更多的时间和空间才能获得结果。 方法 2:使用 Dp 数组让我们举一个例子,在 C++ 中使用Dp 数组找到全为 1 的最大正方形子矩阵。 输出 ![]() 说明 为了理解上述程序,我们首先将查看程序中存在的变量。首先是矩阵,即只包含 1 和 0 的输入二维数组。Dp 数组是一个动态数组,用于存储已计算的子问题解决方案,以避免计算中的错误。它有助于优化程序的递归问题。最初,dp 数组中的所有值都设置为 -1,表示尚未计算。整数 i 和 j 是表示矩阵当前行和当前索引的变量。整数 left、right 和 diagonal 变量存储 findMaxSquare 函数中递归调用的结果。maxSize 将跟踪我们的主要输出,即子正方形的最大大小。 函数 findMaxSquare 的基本情况是如果 i 或 j 超出矩阵范围,它将返回零。之后,我们必须在此函数中进行记忆化。如果矩阵中的 i 和 j 已经计算并存储在 dp 表中。它将返回存储的结果。否则,它将递归计算左侧、上方和对角线单元格的影响,并将结果的最小值加 1 存储在 dp 数组中。之后,此函数将返回最终最大正方形的大小。 方法 3:制表法让我们举一个例子,在 C++ 中使用制表法找到全为 1 的最大正方形子矩阵。 输出 ![]() 说明 程序中存在的变量是一个矩阵,它是一个只包含 1 和 0 的输入二维数组。Dp 是一个动态数组,用于存储已计算的子问题解决方案,以避免计算中的错误。它有助于优化程序的递归问题。最初,dp 数组中的所有值都设置为 0,表示尚未计算。整数 i 和 j 是表示矩阵当前行和当前索引的变量。整数 left、right 和 diagonal 变量存储结果。 程序检查输入矩阵中的每个单元格。如果单元格包含 '1',它会计算可以以该单元格结尾的最大正方形的大小,考虑左侧、上方和左上方对角线附近的单元格。它会跟踪找到的最大正方形。最后,函数返回输入矩阵中由 '1' 组成的最大正方形的面积。 结论以上文章的完美结论如下 暴力法
使用 dp 数组
制表
暴力法仔细检查每个可能的子矩阵,导致时间复杂度大幅增加。另一方面,动态规划技术(自顶向下和自底向上)通过记忆中间结果来优化解决方案,显着降低了时间复杂度。在这些动态规划策略中,自底向上或制表法因其在时间和空间上的卓越效率而脱颖而出。因此,它是解决此问题的首选方法。总之,尽管所有方法都可以解决问题,但采用带制表法的动态规划提供了最有效的解决方案,有效地管理了时间和空间复杂度。 |
下面的代码是在 C++ 中实现两个链表表示的数字相加。在此实现中,输入的链表假定表示数字的顺序是颠倒的,即最低有效数字位于列表的头部。实现...
阅读 4 分钟
素数是指大于 1 且只能被 1 或自身整除的数。换句话说,素数不能被除自身或 1 以外的任何数整除。例如,2、3、5、7、11、13、17、19、23……是素数...
阅读1分钟
在本文中,您将了解其语法和示例。unordered_multimap key_eq 函数是什么?在 C++ 语言中,unordered_multimap 是一种容器,允许具有相同键的多个元素。在此函数中,允许重复键。key_eq 成员函数是...
阅读 3 分钟
C++ 是一种强大的编程语言,提供了广泛的工具和功能来帮助程序员创建高效的代码。C++ 标准库中用于快速创建对的函数模板是 std::make_pair(),这是其中一个工具。在本文中,我们将...
阅读 4 分钟
许多编程语言都提供了一种称为 async/await 的语法属性,该属性允许以类似于典型同步方法的方式组织异步或非阻塞过程。使用 async 和 await 是编写异步代码的一种简单方法。例如,执行一些计算然后...
阅读 3 分钟
在本文中,您将了解在 C++ 中打印 vector 元素的不同方法。但在讨论不同方法之前,您必须了解 vector 的优点和缺点。什么是 Vector?Vector 类似于动态数组,其中容器管理...
5 分钟阅读
在深入研究 C++ 中的 'strcoll()' 之前,了解字符串比较的更广泛背景以及由于不同的字符编码和特定于区域设置的规则而带来的挑战至关重要。让我们探讨这些概念,然后深入研究 'strcoll()' 的具体细节。C++ 中的字符串比较:在 C++ 中,字符串通常...
阅读 6 分钟
在本文中,我们将讨论其语法和示例。btown() 函数是 C 中的一个标准库函数,它将单字节字符转换为宽字符。它用于将单字节字符转换为相应的宽字符,接受...
阅读 3 分钟
引言:三元表达式在编程语言中被广泛使用,它为我们提供了一种表达条件语句的非常清晰的方式。它们的独特结构在分析过程中也带来了挑战。在本文中,我们将讨论如何使用 C++ 中的堆栈将三元表达式转换为二叉树...
7 分钟阅读
QString 是 Qt 中的一个流行类,Qt 是一个用于在 C++ 中开发 GUI 应用程序的跨平台应用程序框架。QString 是一个 Unicode 字符串,用于存储和操作文本。但是,有时您可能需要将 QString 转换为十六进制表示。这...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India