【LeetCode 每日一题】3000. 对角线最长的矩形的面积

Problem: 3000. 对角线最长的矩形的面积

文章目录

整体思路

这段代码的目的是在一个给定的矩形尺寸列表 dimensions 中,找到具有最大对角线的矩形的面积。如果存在多个具有相同最大对角线的矩形,则选择其中面积最大的一个。

该算法采用了一种简单直接的 单次遍历 策略来解决这个问题。它通过迭代检查每一个矩形,并动态地维护当前找到的"最优"矩形的属性。

其核心逻辑步骤如下:

  1. 状态初始化

    • 算法初始化两个变量:maxAreamaxDiagonalSq
    • maxDiagonalSq 用于记录到目前为止遇到的最长对角线的平方值 。使用平方值是一个巧妙的优化,它可以避免使用 Math.sqrt() 进行开方运算,从而避免了浮点数精度问题和不必要的计算开销。
    • maxArea 用于存储与 maxDiagonalSq 对应的矩形的面积。
  2. 遍历所有矩形

    • 代码使用一个 for-each 循环来遍历 dimensions 数组中的每一个矩形 rect
  3. 计算当前矩形的属性

    • 对于每个矩形,首先提取其宽度 width 和高度 height
    • 然后计算两个关键值:
      • 对角线的平方 diagonalSq,根据勾股定理 a² + b² = c² 计算得出。
      • 面积 area,即 width * height
  4. 比较与更新

    • 这是算法的核心判断逻辑。将当前矩形的属性与已记录的"最优"属性(maxDiagonalSqmaxArea)进行比较。
    • 比较分为两个层次:
      a. 主要条件diagonalSq > maxDiagonalSq。如果当前矩形的对角线比之前记录的最长对角线还要长,那么无论面积大小,当前矩形都成为了新的"最优"矩形。此时,同时更新 maxDiagonalSqmaxArea 为当前矩形的值。
      b. 次要条件(平局处理)diagonalSq == maxDiagonalSq && area > maxArea。如果当前矩形的对角线长度与已记录的最长对角线长度相等 ,则需要根据次要规则(面积最大)来决定是否更新。只有当当前矩形的面积 area 大于已记录的 maxArea 时,才会更新 maxArea
  5. 返回结果

    • 在遍历完所有矩形后,maxArea 变量中存储的就是符合题目要求的最终答案,将其返回。

完整代码

java 复制代码
class Solution {
    /**
     * 从一组矩形中找出具有最大对角线的矩形的面积。
     * 如果有多个矩形对角线长度相同,则返回其中面积最大的那个。
     * @param dimensions 一个二维数组,每个子数组 [width, height] 代表一个矩形的尺寸。
     * @return 符合条件的矩形的面积。
     */
    public int areaOfMaxDiagonal(int[][] dimensions) {
        // maxArea: 存储当前找到的最优矩形的面积。
        int maxArea = 0;               
        // maxDiagonalSq: 存储当前找到的最优矩形的对角线的平方值。
        // 使用平方值可以避免开方运算,提高效率并避免浮点数精度问题。
        int maxDiagonalSq = 0;         

        // 遍历输入的每一个矩形
        for (int[] rect : dimensions) {
            // 提取当前矩形的宽度和高度
            int width = rect[0];
            int height = rect[1];

            // 根据勾股定理计算对角线的平方 (d^2 = w^2 + h^2)
            int diagonalSq = width * width + height * height; 
            // 计算当前矩形的面积
            int area = width * height;                        

            // 核心判断逻辑:确定是否需要更新最优矩形
            // 主要条件:当前对角线更长
            if (diagonalSq > maxDiagonalSq || 
               // 次要条件(平局处理):对角线一样长,但当前面积更大
               (diagonalSq == maxDiagonalSq && area > maxArea)) {
                
                // 更新记录,当前矩形成为新的最优矩形
                maxDiagonalSq = diagonalSq;
                maxArea = area;
            }
        }
        // 遍历结束后,maxArea 中存储的就是最终答案
        return maxArea;
    }
}

时空复杂度

时间复杂度:O(N)

  1. 循环 :算法的核心是一个 for 循环,它遍历 dimensions 数组中的每一个矩形。如果输入的矩形数量为 N(即 dimensions.length),那么这个循环将执行 N 次。
  2. 循环内部操作
    • 在循环的每一次迭代中,执行的操作包括:数组访问、两次乘法、一次加法、一次乘法、几次比较和可能的赋值。
    • 所有这些操作都是基本运算,其时间复杂度为 O(1)

综合分析

算法的总时间复杂度是循环次数乘以单次循环的开销,即 N * O(1) = O(N)

空间复杂度:O(1)

  1. 主要存储开销 :算法在执行过程中只使用了几个基本类型的变量(maxArea, maxDiagonalSq, width, height, diagonalSq, area)。
  2. 空间大小 :这些变量的数量是固定的,不随输入 dimensions 数组中矩形数量 N 的增加而增加。

综合分析

算法没有创建任何与输入规模 N 成比例的额外数据结构。因此,其额外辅助空间复杂度为 O(1)

相关推荐
liu****几秒前
笔试强训(十三)
开发语言·c++·算法·1024程序员节
Voyager_433 分钟前
算法学习记录08——并归的应用(LeetCode[315])
学习·算法·leetcode
是码农一枚33 分钟前
洞悉过往,一目了然:浅述视频融合平台EasyCVR如何实现海量视频录像的智能检索与高效回看
算法
是码农一枚36 分钟前
解密视频汇聚平台EasyCVR视频编解码与转码技术如何成就全协议、全终端的无缝视频体验
算法
yuzhuanhei38 分钟前
机器学习算法常用算法
人工智能·算法·机器学习
Bigger1 小时前
🚀 真正实用的前端算法技巧:从 semver-compare 到智能版本排序
前端·javascript·算法
海梨花1 小时前
【力扣Hot100】刷题日记
算法·leetcode·1024程序员节
DuHz1 小时前
使用稀疏采样方法减轻汽车雷达干扰——论文阅读
论文阅读·算法·汽车·信息与通信·信号处理
hansang_IR2 小时前
【算法速成课 3】康托展开(Cantor Expansion)/ 题解 P3014 [USACO11FEB] Cow Line S
c++·算法·状态压缩·康托展开·排列映射
m0_748233642 小时前
【类与对象(中)】C++类默认成员函数全解析
开发语言·c++·算法