首页 > 其他分享 >【DP】LeetCode 1277. 统计全为 1 的正方形子矩阵

【DP】LeetCode 1277. 统计全为 1 的正方形子矩阵

时间:2023-04-25 10:22:41浏览次数:56  
标签:matrix 右下角 int ++ 1277 正方形 DP LeetCode dp

题目链接

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

思路

分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律

在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以 nums1 前 i 个元素(即 nums1[i - 1])组成和以 nums2 前 j 个元素(即 nums2[j - 1])组成的状态,以此类推

字符串也是个数组,是字符数组

表示状态

状态表示就是靠猜,但是会有猜的套路,一般都是通过最终结果和数组数量来猜

这道题的思路和【DP】LeetCode 221. 最大正方形基本一致

因为在本题中我们使用 \(dp[i][j]\) 表示以 \((i, j)\) 为右下角的正方形的个数,同时 \(dp[i][j]\) 也表示以 \((i, j)\) 为右下角的正方形的最大边长,因为这里面有边长为 \(1, 2, ..., dp[i][j]\) 的正方形各一个

找状态转移方程

思考的方向是:大问题的最优解怎么由小问题的最优解得到

参考221题,状态转移方程完全一致

\[dp[i][j] = \left\{ \begin{aligned} & min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1, & matrix[i][j] = 1, \\ & 0, & matrix[i][j] = 0. \end{aligned} \right. \]

因为 \(dp[i][j]\) 表示以 \((i, j)\) 为右下角的正方形的个数,而题目要求求的是总数,所以最后要对 \(dp[i][j]\) 进行求和,这就是最终结果。

注意:这样加和是不会重复计算正方形数量的,因为我们是按照每个坐标作为正方形右下角进行统计,这样能保证每个正方形的定位是独一无二的。

边界处理

对第一行和第一列进行初始化:

\[dp[i][j] = \left\{ \begin{aligned} & 1, & matrix[i][j] = '1', \\ & 0, & matrix[i][j] = '0'. \end{aligned} \right. \]

代码

dp数组版

class Solution {
    public int countSquares(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        // dp[i][j] 表示以 (i, j) 为右下角的正方形的个数
        // 同时 dp[i][j] 也表示以 (i, j) 为右下角的正方形的最大边长
        // 因为这里面有边长为 1, 2, ..., dp[i][j] 的正方形各一个
        int[][] dp = new int[m][n];

        for(int i = 0; i < m; i++){
            dp[i][0] = matrix[i][0];
        }
        dp[0] = matrix[0];

        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                if(matrix[i][j] == 1){
                    dp[i][j] = Math.min(
                            dp[i - 1][j],
                            Math.min(dp[i][j - 1], dp[i - 1][j - 1])
                    ) + 1;
                }
            }
        }

        int result = 0;
        for(int i = 0; i < m; i++){
            result += Arrays.stream(dp[i]).sum();
        }

        return result;
    }
}

标签:matrix,右下角,int,++,1277,正方形,DP,LeetCode,dp
From: https://www.cnblogs.com/shixuanliu/p/17351839.html

相关文章

  • 【LeetCode动态规划#12】详解买卖股票I~IV,经典dp题型
    买卖股票的最佳时机力扣题目链接(opensnewwindow)给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔......
  • #yyds干货盘点# LeetCode程序员面试金典:搜索插入位置
    题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。 示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target=2输出:1示......
  • #yyds干货盘点# LeetCode面试题:分隔链表
    1.简述:给你一个链表的头节点head和一个特定值x,请你对链表进行分隔,使得所有小于x的节点都出现在大于或等于x的节点之前。你应当保留两个分区中每个节点的初始相对位置。 示例1:输入:head=[1,4,3,2,5,2],x=3输出:[1,2,2,4,3,5]示例2:输入:head=[2,1],x=2输出:[1,2......
  • ECNA 2017 Problem G: A Question of Ingestion DP
    StanFordisatypicalcollegegraduatestudent,meaningthatoneofthemostimportantthingsonhismindiswherehisnextmealwillbe.Fortunehassmiledonhimashe’sbeeninvitedtoamulti-coursebarbecueputonbysomeofthecorporatesponsors......
  • [Leetcode]返回链表开始入环的第一个节点
    力扣链接思路一:快慢指针法一个指针从相遇点走,一个指针从起始点走,会在入口点相遇.最终代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*detectCycle(structListNode*head){......
  • LeetCode 40.组合总和II
    1.题目:给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。示例 1:输入:candidates= [10,1,2,7,6,1,5],target= ......
  • Codeforces Round #156 (Div. 2) C. Almost Arithmetical Progression dp
    Genalovessequencesofnumbers.Recently,hehasdiscoveredanewtypeofsequenceswhichhecalledanalmostarithmeticalprogression.Asequenceisanalmostarithmeticalprogression,ifitselementscanberepresentedas:a1 = p,wherepissomeintege......
  • leetcode 550 游戏玩法分析IV
    游戏玩法分析 selectround(avg(a.event_dateisnotnull),2)asfractionfrom(selectplayer_id,min(event_date)asevent_datefromactivitygroupbyplayer_id)aspleftjoinactivityasaonp.player_id=a.player_idanda.event_date=date_......
  • 【DP】LeetCode 221. 最大正方形
    题目链接221.最大正方形思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即nu......
  • LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。前天刚举办2023年力扣杯个人SOLO赛,昨天周赛就出了一场Easy-Easy-Medium-Medium的水场,不得不说LeetCode是懂礼数的......