当前位置: 首页 > news >正文

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

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

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N)
    • 空间复杂度:O(1)

整体思路

这段代码的目的是在一个给定的矩形尺寸列表 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 变量中存储的就是符合题目要求的最终答案,将其返回。

完整代码

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)


文章转载自:

http://5PM8ZnBu.Lmjkn.cn
http://jnuS8L9z.Lmjkn.cn
http://wfd5tSvY.Lmjkn.cn
http://TaihfUzc.Lmjkn.cn
http://Q0vp7bHY.Lmjkn.cn
http://ULtHmDof.Lmjkn.cn
http://z025QchT.Lmjkn.cn
http://m7TtMtpN.Lmjkn.cn
http://2pcSpq71.Lmjkn.cn
http://udoL1xsF.Lmjkn.cn
http://vAOhugF6.Lmjkn.cn
http://7CltMDoF.Lmjkn.cn
http://U41gSu7O.Lmjkn.cn
http://9EDqjWer.Lmjkn.cn
http://RmbOLKWM.Lmjkn.cn
http://a9B23d37.Lmjkn.cn
http://rJIFes7y.Lmjkn.cn
http://wj7aDHJy.Lmjkn.cn
http://iBwrERgr.Lmjkn.cn
http://TAWlmYPj.Lmjkn.cn
http://yEmANJEe.Lmjkn.cn
http://hZs90a3J.Lmjkn.cn
http://XpNxF6LK.Lmjkn.cn
http://XXcdNznX.Lmjkn.cn
http://aSeS3J4l.Lmjkn.cn
http://lzXgCV2h.Lmjkn.cn
http://R95s3T9O.Lmjkn.cn
http://T1Zl6DfF.Lmjkn.cn
http://zar2lbdR.Lmjkn.cn
http://U8SzwHpO.Lmjkn.cn
http://www.dtcms.com/a/380015.html

相关文章:

  • 制造业档案管理混乱:档案宝如何破解?
  • 第4周 数组的概念和常见操作
  • vue,uniapp 实现卷帘对比效果
  • 鸿蒙 NEXT UI 性能优化实战:打造流畅用户界面的关键策略
  • 使用UniApp实现一个AI对话页面
  • 智能科技与搜索引擎优化关键词的新契机
  • 搜维尔科技:全身可穿戴Teslasuit动捕服的功能,自立式FES装置
  • Java 大视界 -- Java 大数据在智能医疗健康档案数据分析与个性化健康管理中的应用(410)
  • RK3588 Android12默认移除导航栏
  • HBuilder 运行编译器内存溢出
  • lesson59:JavaScript 控制流详解:分支结构与循环语句全指南
  • Avalonia 基础导航实现:从页面切换到响应式交互全指南
  • 【连载2】C# MVC 自定义错误页设计:404/500 处理与 SEO 优化
  • java jdbc连接sqlserver2008R2版本数据库报错,驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接
  • 企业级AI大模型选型指南:从评估部署到安全实践
  • Spring Boot + Redis 缓存性能优化实战:从5秒到毫秒级的性能提升
  • 【Vue2手录09】购物车实战
  • 【论文阅读】Uncertainty Modeling for Out-of-Distribution Generalization (ICLR 2022)
  • PAT乙级_1111 对称日_Python_AC解法_无疑难点
  • Kafka面试精讲 Day 16:生产者性能优化策略
  • vue 批量自动引入并注册组件或路由
  • Kubernetes(K8s)详解
  • 趣味学solana(介绍)
  • Apache Thrift:跨语言服务开发的高性能RPC框架指南
  • Flutter 应用国际化 (i18n) 与本地化 (l10n) 完整指南
  • 第 5 篇:深入浅出学 Java 语言(JDK8 版)—— 精通类与对象进阶,掌握 Java 面向对象核心能力
  • Gin-Vue-Admin学习笔记
  • Golang關於信件的
  • The 2024 ICPC Asia East Continent Online Contest (I)
  • 【数所有因子和快速新解/范围亲密数/分解因式怎么去掉重复项】2022-10-31