当前位置: 面试刷题>> 构造矩形 (经典算法题500道)


题目描述补充

题目:构造矩形

给定一个整数数组nums,其中每个元素代表矩形的宽度或高度(不考虑方向,即宽度和高度可以互换)。你需要使用这些整数来构造尽可能多的矩形(每个矩形的长和宽必须来自nums中的元素,且每个元素只能使用一次)。构造矩形时,不需要考虑矩形的方向,即如果两个矩形(a×b 和 b×a)算作不同的矩形,那么在这个问题中它们应被视为相同的矩形。请返回可以构造的矩形的最大数量。

示例

输入nums = [1, 1, 2, 2] 输出:3 解释:可以构造的矩形有:(1,1), (1,2) 和 (2,2)。

PHP 示例代码

<?php
function maxRectangles($nums) {
    $count = 0;
    $freq = array_count_values($nums); // 统计每个宽高的频率
    sort($nums); // 对数组进行排序,优化查找过程

    for ($i = 0; $i < count($nums); $i++) {
        for ($j = $i + 1; $j < count($nums); $j++) {
            // 如果当前宽度大于高度,则停止内层循环
            if ($nums[$i] > $nums[$j]) break;
            // 计算以当前宽度和高度为边的矩形数量
            $count += min($freq[$nums[$i]], floor($freq[$nums[$j]] / 2));
        }
    }

    return $count;
}

// 示例测试
$nums = [1, 1, 2, 2];
echo maxRectangles($nums); // 输出: 3
?>

注意:上述PHP代码是一个简化的版本,主要用于说明思路,可能不是最优解。真实环境中,你可能需要更复杂的逻辑来处理特殊情况或优化性能。

Python 示例代码

def maxRectangles(nums):
    from collections import Counter
    freq = Counter(nums)
    nums.sort()  # 排序以优化查找
    count = 0
    
    for i in range(len(nums)):
        for j in range(i + 1, len(nums)):
            if nums[i] > nums[j]:
                break
            # 计算以nums[i]和nums[j]为长宽或高宽的矩形数量
            count += min(freq[nums[i]], freq[nums[j]] // 2)
    
    return count

# 示例测试
nums = [1, 1, 2, 2]
print(maxRectangles(nums))  # 输出: 3

JavaScript 示例代码

function maxRectangles(nums) {
    const freq = {};
    for (let num of nums) {
        freq[num] = (freq[num] || 0) + 1;
    }
    nums.sort((a, b) => a - b); // 排序
    let count = 0;

    for (let i = 0; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[i] > nums[j]) break;
            // 计算矩形数量
            count += Math.min(freq[nums[i]], Math.floor(freq[nums[j]] / 2));
        }
    }

    return count;
}

// 示例测试
const nums = [1, 1, 2, 2];
console.log(maxRectangles(nums)); // 输出: 3

码小课网站中有更多关于算法和数据结构的相关内容分享给大家学习,包括但不限于排序、搜索、图论、动态规划等话题的深入解析和实战应用。

推荐面试题