PHP 计算矩形中的正方形数量(Count number of squares in a rectangle)

给定一个 amxn 矩形,其中有多少个正方形?

例如: 

输入:   m = 2, n = 2
输出: 5
有 4 个尺寸为 1x1 的正方形 + 1 个尺寸为 2x2 的正方形。

输入: m = 4, n = 3
输出: 20
有 12 个尺寸为 1x1 的正方形 + 
          6 个尺寸为 2x2 的正方形 + 
          2 个尺寸为 3x3 的正方形。

我们先针对 m = n 即正方形解决这个问题:
对于 m = n = 1,输出:1
对于 m = n = 2,输出:4 + 1 [ 4 个大小为 1×1 + 1 个大小为 2×2 ] 对于
m = n = 3,输出:9 + 4 + 1 [ 9 个大小为 1×1 + 4 个大小为 2×2 + 1 个大小为 3×3 ]
对于 m = n = 4,输出 16 + 9 + 4 + 1 [ 16 个大小为 1×1 + 9 个大小为 2×2 + 4 个大小为 3×3 + 1 个大小为 4×4 ]
通常,它似乎是 n^2 + (n-1)^2 + … 1 = n(n+1)(2n+1)/6

当 m 可能不等于 n 时,让我们解决这个问题:假设 m <= n 

从上面的解释中,我们知道 amxm 矩阵的方格数为 m(m+1)(2m+1)/6

当我们添加一列时会发生什么,即 mx(m+1)矩阵中的方格数是多少?

当我们添加一列时,增加的方块数为 m + (m-1) + … + 3 + 2 + 1 
[ m 个大小为 1×1 的方块 + (m-1) 个大小为 2×2 的方块 + … + 1 个大小为 mxm 的方块 ] 
等于 m(m+1)/2

因此,当我们添加 (nm) 列时,增加的方格总数为 (nm)*m(m+1)/2。
因此,方格总数为 m(m+1)(2m+1)/6 + (nm)*m(m+1)/2。
使用相同的逻辑,我们可以证明 n <= m 的情况。

因此,总的来说, 

当 n 为较大维度时,总方块数 = mx (m+1) x (2m+1)/6 + (nm) xmx (m+1)/2

利用上述逻辑,我们也可以证明正方形中的正方形数量为 n(n+1)(2n+1)/6

以下是上述公式的实现:

<?php
// PHP program to count squares
// in a rectangle of size m x n
 
// Returns count of all squares 
// in a rectangle of size m x n
function countSquares($m, $n)
{
    // If n is smaller, swap m and n
    if ($n < $m)
        list($m, $n) = array($n, $m);
     
    // Now n is greater dimension, 
    // apply formula
    return $m * ($m + 1) * (2 * $m + 1) / 
       6 + ($n - $m) * $m * ($m + 1) / 2;
}
 
// Driver Code
$m = 4; $n = 3;
echo("Count of squares is " . countSquares($m, $n));
 
// This code is contributed by Ajit.
?> 

输出 : 

方格数为 20

时间复杂度: O(1)

辅助空间: O(1)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值