【LeetCode 每日一题】3000. 对角线最长的矩形的面积
Problem: 3000. 对角线最长的矩形的面积
文章目录
- 整体思路
- 完整代码
- 时空复杂度
- 时间复杂度:O(N)
- 空间复杂度:O(1)
整体思路
这段代码的目的是在一个给定的矩形尺寸列表 dimensions
中,找到具有最大对角线的矩形的面积。如果存在多个具有相同最大对角线的矩形,则选择其中面积最大的一个。
该算法采用了一种简单直接的 单次遍历 策略来解决这个问题。它通过迭代检查每一个矩形,并动态地维护当前找到的“最优”矩形的属性。
其核心逻辑步骤如下:
-
状态初始化:
- 算法初始化两个变量:
maxArea
和maxDiagonalSq
。 maxDiagonalSq
用于记录到目前为止遇到的最长对角线的平方值。使用平方值是一个巧妙的优化,它可以避免使用Math.sqrt()
进行开方运算,从而避免了浮点数精度问题和不必要的计算开销。maxArea
用于存储与maxDiagonalSq
对应的矩形的面积。
- 算法初始化两个变量:
-
遍历所有矩形:
- 代码使用一个
for-each
循环来遍历dimensions
数组中的每一个矩形rect
。
- 代码使用一个
-
计算当前矩形的属性:
- 对于每个矩形,首先提取其宽度
width
和高度height
。 - 然后计算两个关键值:
- 对角线的平方
diagonalSq
,根据勾股定理a² + b² = c²
计算得出。 - 面积
area
,即width * height
。
- 对角线的平方
- 对于每个矩形,首先提取其宽度
-
比较与更新:
- 这是算法的核心判断逻辑。将当前矩形的属性与已记录的“最优”属性(
maxDiagonalSq
和maxArea
)进行比较。 - 比较分为两个层次:
a. 主要条件:diagonalSq > maxDiagonalSq
。如果当前矩形的对角线比之前记录的最长对角线还要长,那么无论面积大小,当前矩形都成为了新的“最优”矩形。此时,同时更新maxDiagonalSq
和maxArea
为当前矩形的值。
b. 次要条件(平局处理):diagonalSq == maxDiagonalSq && area > maxArea
。如果当前矩形的对角线长度与已记录的最长对角线长度相等,则需要根据次要规则(面积最大)来决定是否更新。只有当当前矩形的面积area
大于已记录的maxArea
时,才会更新maxArea
。
- 这是算法的核心判断逻辑。将当前矩形的属性与已记录的“最优”属性(
-
返回结果:
- 在遍历完所有矩形后,
maxArea
变量中存储的就是符合题目要求的最终答案,将其返回。
- 在遍历完所有矩形后,
完整代码
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)
- 循环:算法的核心是一个
for
循环,它遍历dimensions
数组中的每一个矩形。如果输入的矩形数量为N
(即dimensions.length
),那么这个循环将执行N
次。 - 循环内部操作:
- 在循环的每一次迭代中,执行的操作包括:数组访问、两次乘法、一次加法、一次乘法、几次比较和可能的赋值。
- 所有这些操作都是基本运算,其时间复杂度为 O(1)。
综合分析:
算法的总时间复杂度是循环次数乘以单次循环的开销,即 N * O(1)
= O(N)。
空间复杂度:O(1)
- 主要存储开销:算法在执行过程中只使用了几个基本类型的变量(
maxArea
,maxDiagonalSq
,width
,height
,diagonalSq
,area
)。 - 空间大小:这些变量的数量是固定的,不随输入
dimensions
数组中矩形数量N
的增加而增加。
综合分析:
算法没有创建任何与输入规模 N
成比例的额外数据结构。因此,其额外辅助空间复杂度为 O(1)。