字节跳动竞赛算法-统计全1子矩阵

力扣X字节跳动测试-统计全1子矩阵
在这里插入图片描述

这道题做了一个小时没有做出来,想用动态规划,对于只有单行或者单列的情况,还是很好解决的,但是碰到多行多列的情况,就不知道该怎么处理了,还是太菜了,好好学习一下别人的做法吧。

使用与运算符

采用逐行分析法:
对于只有一行数组而言,比如[1,1,1,0,1,1,1,1,0,1]
前3个1,能组成 3个 1x1, 2个 1x2, 1个 1x3,一共3+2+1=6种情况
中间4个1,能组成4个 1x1, 3个 1x2, 2个 1x3,1个 1x4,一共4+3+2+1=10种情况
所以能找到一种规律,连续出现的n个1,可以组成 1 + 2 + 3 + … + n 种情况,使用公式,就是 n * (n + 1) / 2 种情况

上面是只有一行的情况。
对于2行而言,比如

只有第3列能组成 2x1, 最后两列能组成 1个2x2,2个2x1,
在这里插入图片描述
我们可以发现,只有在同一列,全部都是1时才能起到作用,对于其他没被框住的地方,1的存在是没有意义的,这里的没有意义指的是,把第一行也考虑进去的前提下,第二行第5列的1是没有意义的,因为和第一行第5列不能凑成全1。这个结果和只有1行的[0, 0, 1 ,0, 0, 0 ,0 , 1, 1]的结果是一样的。
2行变成1行,通过观察可以发现,可以使用与运算 & 实现。

所以整个遍历顺序是这样的:

①先遍历当前行(R),看能凑成多少种方法;
②将当前行(R)与下面一行(R+1)进行与操作,得到nums[],计算该nums[]能凑成多少种方法,进行累加;将结果nums[]再和下下行(R+2)进行与操作,进行累加…直到所有行合并成一行,这次累加结束。
③将R+1行当做当前行,重复①~③&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值