热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode1277:计算全由1组成的正方形子矩阵数量(动态规划解法)

题目要求在给定的m×n矩阵中,计算并返回所有完全由1组成的正方形子矩阵的数量。矩阵中的每个元素只能是0或1。通过动态规划的方法,可以高效地解决这一问题。示例中,输入矩阵包含多个由1组成的正方形子矩阵,需要统计这些子矩阵的总数。

1. 题目

给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成正方形 子矩阵的个数。

示例 1:
输入:matrix =
[[0,1,1,1],[1,1,1,1],[0,1,1,1]
]
输出:15
解释:
边长为 1 的正方形有 10 个。
边长为 2 的正方形有 4 个。
边长为 3 的正方形有 1 个。
正方形的总数 = 10 + 4 + 1 = 15.示例 2:
输入:matrix =
[[1,0,1],[1,1,0],[1,1,0]
]
输出:7
解释:
边长为 1 的正方形有 6 个。
边长为 2 的正方形有 1 个。
正方形的总数 = 6 + 1 = 7.提示:
1 <&#61; arr.length <&#61; 300
1 <&#61; arr[0].length <&#61; 300
0 <&#61; arr[i][j] <&#61; 1

来源&#xff1a;力扣&#xff08;LeetCode&#xff09;
链接&#xff1a;https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones
著作权归领扣网络所有。商业转载请联系官方授权&#xff0c;非商业转载请注明出处。



2. 解题

类似题目&#xff1a;
LeetCode 1504. 统计全 1 子矩形&#xff08;记录左侧的连续1的个数&#xff09;
LeetCode 5655. 重新排列后的最大子矩阵&#xff08;前缀和&#43;排序&#xff09;


  • dp[i][j] 表示 以(i,j)右下角的最大正方形边长
  • 第一行、第一列肯定最大是1&#xff08;矩阵值为1的话&#xff09;
  • 其他为 1 位置的最大边长跟它相邻的几块的关系&#xff1a;等于左上方向3个最短的边长&#43;1
  • 正方形的个数等于最大的边长
    在这里插入图片描述

class Solution {
public:int countSquares(vector<vector<int>>& matrix) {int m &#61; matrix.size(), n &#61; matrix[0].size(), i, j, count &#61; 0;vector<vector<int>> dp(m,vector<int>(n,0));//dp[i][j] 表示 以i,j为右下角的最大正方形边长for(i &#61; 0; i < m; &#43;&#43;i){for(j &#61; 0; j < n; &#43;&#43;j){if(i&#61;&#61;0 || j&#61;&#61;0)dp[i][j] &#61; matrix[i][j];//最多边长1else if(matrix[i][j]&#61;&#61;1)dp[i][j] &#61; 1&#43;min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]));count &#43;&#61; dp[i][j];}}return count;}
};

另评论区Gremist优化了内存&#xff0c;原地算法

class Solution {
public:int countSquares(vector<vector<int>>& matrix) {int ans &#61; 0;for (int i &#61; 0; i < matrix.size(); i&#43;&#43;) {for (int j &#61; 0; j < matrix[0].size(); j&#43;&#43;) {if (i && j && matrix[i][j]) {matrix[i][j] &#43;&#61; min({matrix[i-1][j-1], matrix[i-1][j], matrix[i][j-1]});}ans &#43;&#61; matrix[i][j];}}return ans;}
};

推荐阅读
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文介绍如何使用 Python 将一个字符串按照指定的行和元素分隔符进行两次拆分,最终将字符串转换为矩阵形式。通过两种不同的方法实现这一功能:一种是使用循环与 split() 方法,另一种是利用列表推导式。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
author-avatar
刺猬xiaojie
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有