可以形成最大正方形的矩形数目

标签: 数组

难度: Easy

给你一个数组 rectangles ,其中 rectangles[i] = [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi

如果存在 k 同时满足 k <= lik <= wi ,就可以将第 i 个矩形切成边长为 k 的正方形。例如,矩形 [4,6] 可以切成边长最大为 4 的正方形。

maxLen 为可以从矩形数组 rectangles 切分得到的 最大正方形 的边长。

请你统计有多少个矩形能够切出边长为 maxLen 的正方形,并返回矩形 数目

 

示例 1:

输入:rectangles = [[5,8],[3,9],[5,12],[16,5]]
输出:3
解释:能从每个矩形中切出的最大正方形边长分别是 [5,3,5,5] 。
最大正方形的边长为 5 ,可以由 3 个矩形切分得到。

示例 2:

输入:rectangles = [[2,3],[3,7],[4,3],[3,7]]
输出:3

 

提示:

  • 1 <= rectangles.length <= 1000
  • rectangles[i].length == 2
  • 1 <= li, wi <= 109
  • li != wi

Submission

运行时间: 32 ms

内存: 16.4 MB

class Solution:
    def countGoodRectangles(self, rectangles: List[List[int]]) -> int:
        res, maxLen = 0, 0
        for l, w in rectangles:
            k = min(l, w)
            if k == maxLen:
                res += 1
            elif k > maxLen:
                res = 1
                maxLen = k
        return res

Explain

解题思路是遍历矩形列表,计算每个矩形可以形成的最大正方形的边长(取长和宽中的最小值),并在此过程中跟踪记录可以形成的最大正方形边长maxLen。如果某个矩形的最大正方形边长等于当前maxLen,增加计数器res。如果某个矩形的最大正方形边长大于当前maxLen,更新maxLen并重置计数器res为1。这样,最终res的值就是可以切出边长为maxLen的正方形的矩形数量。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def countGoodRectangles(self, rectangles: List[List[int]]) -> int:
        res, maxLen = 0, 0  # 初始化计数器和最大边长
        for l, w in rectangles:  # 遍历每个矩形
            k = min(l, w)  # 计算能形成的最大正方形的边长
            if k == maxLen:  # 如果当前正方形的边长等于已知的最大边长
                res += 1  # 增加符合条件的矩形数量
            elif k > maxLen:  # 如果找到了更大的正方形边长
                res = 1  # 重置计数器
                maxLen = k  # 更新最大边长
        return res  # 返回可以切出最大正方形的矩形数量

Explore

一个矩形的最大正方形侧边长度由其最短边决定,因为正方形的所有边长相等。要从矩形中切出一个最大的正方形,其边长必须不超过矩形的长度和宽度中的较小者。因此,计算最大正方形边长时,必须取矩形的长度和宽度的最小值。

当找到一个新的更大的正方形边长时,之前的计数(那些较小的正方形的数量)不再是我们关注的重点,因为我们的目标是找到可以形成最大正方形的矩形数目。因此,需要重置计数器res为1,表示我们找到了第一个能形成这个新的最大正方形边长的矩形。

如果输入的矩形数组是空的,那么没有任何矩形可以用来形成正方形,因此应该返回0。在代码中,如果数组是空的,那么for循环将不会执行,因此res(初始化为0)保持不变,最终返回的也是0。

如果在遍历过程中遇到两个矩形的最大正方形边长相同,并且这个边长等于当前已知的最大边长maxLen,那么会直接在res上累加计数。这意味着我们在计数中包括了所有具有相同最大正方形边长的矩形。