[路飞]_leetcode 1725. 可以形成最大正方形的矩形数目

208 阅读1分钟

「这是我参与2022首次更文挑战的第19,活动详情查看:2022首次更文挑战

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

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

如果存在 k 同时满足 k <= li 和 k <= 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

分析

首先rectangles是一个二维数组,我需要根据题意中我们需要在 rectangles[i] 中找到最大的边长。然而最大边长就是就 rectangles[i] 里最小的。我们可以通过 Math.min方法来求出最小值,这个最小值就是我们需要的最大边。

我们会从 rectangles 中获取很多边长为n的正方形。那么我们如果找出最大的呢?我们可以定义一个 maxLen 变量用于存放最长边的正方形,再定义一个 ans 来记录最长边的正方形的个数。在遍历时,我们通过不断计算出当前正方形的边长,对比 maxLen。 如果前正方形的边长大于 maxLen 时,我把 maxLen 赋值为当前正方形的边长并使 ans 等于1;反之我们只需要将 ans++即可。

逐步实现

定义 maxLen 变量用于存放最长边的正方形,ans 来记录最长边的正方形的个数。

var countGoodRectangles = function(rectangles) {
    let maxLen = 0, ans = 0
};

遍历rectangles,我们通过 Math.min 方法得到当前正方形的边长,对比 maxLen。 如果前正方形的边长大于 maxLen 时,我把 maxLen 赋值为当前正方形的边长并使 ans 等于1;反之我们只需要将 ans++即可

var countGoodRectangles = function(rectangles) {
    let maxLen = 0, ans = 0
    for(const rectangle of rectangles) {
        const cur = Math.min(rectangle[0], rectangle[1])
        if(cur > maxLen) {
            maxLen = cur
            ans = 1
        } else if(cur == maxLen)
            ans++
    }
};

完整代码

/**
 * @param {number[][]} rectangles
 * @return {number}
 */
var countGoodRectangles = function(rectangles) {
    let maxLen = 0
    let ans = 0
    for(const rectangle of rectangles) {
        const cur = Math.min(rectangle[0], rectangle[1])
        if(cur > maxLen) {
            maxLen = cur
            ans = 1
        } else if(cur == maxLen)
            ans++
    }
    return ans
};