(nice!!!)(LeetCode 每日一题) 1277. 统计全为 1 的正方形子矩阵 (动态规划)

题目:1277. 统计全为 1 的正方形子矩阵

思路:动态规划dp,时间复杂度0(nm)。

考虑每个点,作为正方形的右下角的情况,有多少个正方形。这就需要知道最大可能的正方形长度,假设点(x,y)的最大可能的正方形长度是a,那么就有a个。

而如何找到最大的长度,其实可以由(x-1,y)、(x-1,y-1)、(x,y-1)这三个点的最大长度推出,其实就是三者的最大长度的最小值+1,即:vi+1j+1=min({vij,vi+1j,vij+1})+1。这里用到的就是动态规划

大神的思路

C++版本:

cpp 复制代码
class Solution {
public:
    int countSquares(vector<vector<int>>& matrix) {
        int n=matrix.size(),m=matrix[0].size();
        
        vector<vector<int>> v(n+1,vector<int>(m+1,0));
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(matrix[i][j]==1){
                    v[i+1][j+1]=min({v[i][j],v[i+1][j],v[i][j+1]})+1;
                    ans+=v[i+1][j+1];
                }
            }
        }
        return ans;
    }
};

JAVA版本:

java 复制代码
class Solution {
    public int countSquares(int[][] matrix) {
        int n=matrix.length,m=matrix[0].length;
        int[][] v=new int[n+1][m+1];
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(matrix[i][j]==1){
                    v[i+1][j+1]=Math.min(Math.min(v[i][j],v[i+1][j]),v[i][j+1])+1;
                    ans+=v[i+1][j+1];
                }
            }
        }
        return ans;
    }
}

GO版本:

go 复制代码
func countSquares(matrix [][]int) int {
    n,m:=len(matrix),len(matrix[0])
    v:=make([][]int,n+1)
    for i:=range v {
        v[i]=make([]int,m+1)
    }
    ans:=0
    for i:=0;i<n;i++ {
        for j:=0;j<m;j++ {
            if matrix[i][j]==1 {
                v[i+1][j+1]=min(min(v[i][j],v[i+1][j]),v[i][j+1])+1
                ans+=v[i+1][j+1]
            }
        }
    }
    return ans

}
相关推荐
Frank_refuel3 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog4 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
hetao17338375 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
\光辉岁月/6 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang6 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
Zootopia6266 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan6 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
郑州光合科技余经理6 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071576 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat6 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference