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

LeetCode题练习与总结:矩形面积--223

一、题目描述

给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形,请你计算并返回两个矩形覆盖的总面积。

每个矩形由其 左下 顶点和 右上 顶点坐标表示:

  • 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。
  • 第二个矩形由其左下顶点 (bx1, by1) 和右上顶点 (bx2, by2) 定义。

示例 1:

输入:ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4, bx1 = 0, by1 = -1, bx2 = 9, by2 = 2
输出:45

示例 2:

输入:ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2, bx1 = -2, by1 = -2, bx2 = 2, by2 = 2
输出:16

提示:

  • -10^4 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 10^4

二、解题思路

  1. 首先计算两个矩形各自的面积。对于任何一个矩形,其面积可以通过计算长和宽的乘积得到,其中长为右上顶点的x坐标减去左下顶点的x坐标,宽为右上顶点的y坐标减去左下顶点的y坐标。

  2. 然后计算两个矩形的重叠面积。两个矩形重叠的部分也是矩形,其左下顶点的坐标为两个矩形左下顶点坐标的x和y坐标中的较大值,右上顶点的坐标为两个矩形右上顶点坐标的x和y坐标中的较小值。重叠矩形的面积可以通过计算长和宽的乘积得到,但需要确保长和宽都大于0,否则重叠面积为0。

  3. 最后,将两个矩形的面积相加,再减去重叠部分的面积,即可得到两个矩形覆盖的总面积。

三、具体代码

class Solution {
    public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
        // 计算第一个矩形的面积
        int area1 = (ax2 - ax1) * (ay2 - ay1);
        // 计算第二个矩形的面积
        int area2 = (bx2 - bx1) * (by2 - by1);
        
        // 计算两个矩形重叠部分的坐标
        int overlapX1 = Math.max(ax1, bx1);
        int overlapY1 = Math.max(ay1, by1);
        int overlapX2 = Math.min(ax2, bx2);
        int overlapY2 = Math.min(ay2, by2);
        
        // 计算重叠部分的面积
        int overlapArea = 0;
        if (overlapX2 > overlapX1 && overlapY2 > overlapY1) {
            overlapArea = (overlapX2 - overlapX1) * (overlapY2 - overlapY1);
        }
        
        // 计算总面积
        return area1 + area2 - overlapArea;
    }
}

这段代码首先计算了两个矩形各自的面积,然后确定了重叠矩形的坐标,并计算了重叠面积,最后返回了两个矩形覆盖的总面积。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 计算第一个矩形的面积:O(1)(常数时间)
  • 计算第二个矩形的面积:O(1)(常数时间)
  • 计算重叠矩形的坐标:每个坐标计算使用了Math.max和Math.min,这两个操作都是O(1)(常数时间)
  • 计算重叠矩形的面积:O(1)(常数时间,只有一行判断和计算)
  • 计算总面积:O(1)(常数时间)

由于上述所有操作都是常数时间的操作,且没有循环或递归结构,因此整个函数的时间复杂度为O(1),即常数时间复杂度。

2. 空间复杂度
  • 整个函数只使用了固定数量的变量(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2, area1, area2, overlapX1, overlapY1, overlapX2, overlapY2, overlapArea),这些变量占用的空间不会随着输入数据的大小而改变。
  • 没有使用额外的数据结构,如数组、列表或哈希表。

因此,整个函数的空间复杂度为O(1),即常数空间复杂度。

五、总结知识点

  • 基本算术运算

    • 加法(+)、减法(-)、乘法(*):用于计算矩形的面积和重叠部分的面积。
  • Java基本数据类型

    • int:用于定义整数类型的变量,存储矩形坐标和面积。
  • Java Math类

    • Math.max(int a, int b):返回两个整数中的较大值。
    • Math.min(int a, int b):返回两个整数中的较小值。
  • 条件语句

    • if 语句:用于检查重叠矩形是否存在(即重叠矩形的宽度和高度是否大于0)。
  • 函数定义

    • public 关键字:定义访问权限,表示方法可以被任何其他类访问。
    • int:指定函数返回类型,这里返回一个整数类型的面积。
    • 方法名 computeArea:遵循Java命名习惯,使用驼峰命名法。
    • 参数列表:方法接受8个整数类型的参数,代表两个矩形的坐标。
  • 逻辑思维

    • 分析问题并确定解决方案的逻辑步骤,例如先计算两个矩形的面积,再计算重叠面积,最后计算总面积。
  • 空间坐标理解

    • 理解二维平面上的矩形坐标表示,包括左下角和右上角的坐标。
  • 几何知识

    • 矩形的面积计算公式:长乘以宽。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。


http://www.kler.cn/a/299195.html

相关文章:

  • ansible--role
  • Java解决Jira单点登录、登出思路介绍
  • 解锁Web3.0——Scaffold-eth打造以太坊DApp的终极指南
  • Qt常用控件——QLabel
  • [数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别
  • mqtt协议用于物联网数据传输协议,它与http协议有什么区别
  • 时间日期工具类
  • 亿发:信息化智能化需求大幅提升,企业信息化建设又迈出关键一步
  • 浏览器百科:网页存储篇-如何在Chrome中打开IndexedDB窗格(十一)
  • 【论文分享精炼版】 sNPU: Trusted Execution Environments on Integrated NPUs
  • Apache License 2.0 和 MIT License 区别
  • 安科瑞Acrelcloud-6000银行安全用电管理平台在湖南新盛业的应用
  • Android利用andserver库搭建本地https服务器
  • 《python语言程序设计》2018版第8章第14题金融:信用卡号合法性 利用6.29题
  • 万字长文解析:计算机视觉领域的目标检测与图像分割(不断更新)
  • Java开发常用软件下载地址
  • 类组件化websocket的方法(心跳机制)
  • 漫谈设计模式 [8]:装饰器模式
  • C语言:刷题日志(3)
  • 【QT】文件读写,文件对话框