LeetCode题练习与总结:完美矩形--391

news2024/12/23 5:56:39

一、题目描述

给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) ,右上顶点是 (ai, bi) 。

如果所有矩形一起精确覆盖了某个矩形区域,则返回 true ;否则,返回 false 。

 

示例 1:

输入:rectangles = [[1,1,3,3],[3,1,4,2],[3,2,4,4],[1,3,2,4],[2,3,3,4]]
输出:true
解释:5 个矩形一起可以精确地覆盖一个矩形区域。 

示例 2:

输入:rectangles = [[1,1,2,3],[1,3,2,4],[3,1,4,2],[3,2,4,4]]
输出:false
解释:两个矩形之间有间隔,无法覆盖成一个矩形。

示例 3:

输入:rectangles = [[1,1,3,3],[3,1,4,2],[1,3,2,4],[2,2,4,4]]
输出:false
解释:因为中间有相交区域,虽然形成了矩形,但不是精确覆盖。

提示:

  • 1 <= rectangles.length <= 2 * 10^4
  • rectangles[i].length == 4
  • -10^5 <= xi < ai <= 10^5
  • -10^5 <= yi < bi <= 10^5

二、解题思路

  1. 首先,我们可以计算出所有矩形的总面积,记为 totalArea
  2. 然后,我们需要找到能够被所有矩形覆盖的最小矩形的边界。这个矩形的左下角顶点将是所有给定矩形左下角顶点的最小值,右上角顶点将是所有给定矩形右上角顶点的最大值。
  3. 计算这个最小矩形的面积,记为 expectedArea
  4. 如果 totalArea 不等于 expectedArea,那么直接返回 false,因为矩形的总面积不匹配。
  5. 为了检查矩形是否精确覆盖,我们还需要确保矩形的边缘没有重叠或间隙。我们可以使用一个集合来记录所有矩形的边缘。对于每个矩形,我们添加它的四个边到集合中,如果这条边已经存在于集合中,则移除它(表示这条边被覆盖了两次,即两个矩形的边缘重合)。最后,集合中应该只剩下四个边,它们分别是组成最小矩形的四条边。
  6. 最后,检查集合中的边是否与最小矩形的边匹配。

三、具体代码

import java.util.HashSet;
import java.util.Set;

class Solution {
    public boolean isRectangleCover(int[][] rectangles) {
        int lx = Integer.MAX_VALUE, ly = Integer.MAX_VALUE, rx = Integer.MIN_VALUE, ry = Integer.MIN_VALUE;
        int totalArea = 0;
        Set<String> edges = new HashSet<>();

        for (int[] rect : rectangles) {
            lx = Math.min(lx, rect[0]);
            ly = Math.min(ly, rect[1]);
            rx = Math.max(rx, rect[2]);
            ry = Math.max(ry, rect[3]);
            totalArea += (rect[2] - rect[0]) * (rect[3] - rect[1]);

            String[] edgeKeys = {
                rect[0] + " " + rect[1],
                rect[0] + " " + rect[3],
                rect[2] + " " + rect[1],
                rect[2] + " " + rect[3]
            };

            for (String key : edgeKeys) {
                if (!edges.add(key)) {
                    edges.remove(key);
                }
            }
        }

        int expectedArea = (rx - lx) * (ry - ly);
        if (totalArea != expectedArea) {
            return false;
        }

        String[] finalEdges = {
            lx + " " + ly,
            lx + " " + ry,
            rx + " " + ly,
            rx + " " + ry
        };

        for (String edge : finalEdges) {
            if (!edges.contains(edge)) {
                return false;
            }
        }

        return edges.size() == 4;
    }
}

在这个代码中,我们使用了一个字符串来表示矩形的边,格式为 “x y”,其中 x 和 y 是矩形的横纵坐标。通过这种方式,我们可以将矩形的边作为唯一的标识符添加到集合中。

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

1. 时间复杂度
  • 我们遍历了整个 rectangles 数组,其中包含 n 个矩形。每个矩形我们进行常数时间的操作,例如更新边界坐标、计算面积和更新集合 edges。因此,这部分的时间复杂度是 O(n)。

  • 对于每个矩形,我们添加或移除四条边到集合 edges 中。集合 add 和 remove 操作的平均时间复杂度是 O(1)。

  • 在最后,我们检查集合 edges 的大小和内容,这也是常数时间操作。

综上所述,整体的时间复杂度是 O(n),其中 n 是矩形数组的长度。

2. 空间复杂度
  • 我们使用了几个变量来存储边界坐标和总面积,这些变量占用的空间是常数,即 O(1)。

  • 我们使用了一个 HashSet 集合 edges 来存储矩形的边。在最坏的情况下,如果所有的矩形边都不重合,那么集合的大小将是 4n(每个矩形有4条边)。因此,空间复杂度是 O(n)。

综上所述,整体的空间复杂度是 O(n),其中 n 是矩形数组的长度。

五、总结知识点

  • Java 基础语法

    • 类定义(class 关键字)
    • 方法定义(public 访问修饰符,返回类型,方法名,参数列表)
    • 变量声明与初始化(基本数据类型,如 int
    • 数组的使用(通过索引访问数组元素)
  • Java 集合框架

    • HashSet 类的使用,用于存储唯一的元素集合
    • 集合的基本操作,如 add(添加元素)和 remove(移除元素)
    • contains 方法,用于检查集合中是否包含某个元素
  • 数学运算

    • 计算矩形的面积(通过长和宽的乘积)
    • 使用 Math.min 和 Math.max 方法来找到最小和最大的边界值
  • 字符串操作

    • 字符串拼接(使用 + 运算符连接字符串)
    • 使用字符串作为集合中元素的键,以表示矩形的边
  • 逻辑控制

    • 循环结构(for 循环,用于遍历矩形数组)
    • 条件语句(if 语句,用于检查条件并作出决策)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac中安装OhMyZsh

Mac中安装OhMyZsh 文章目录 Mac中安装OhMyZsh一、Homebrew二、OhMyZsh1、Oh-My-Zsh配置1.1&#xff1a;主题配置1.2&#xff1a;插件配置&#xff08;语法高亮和自动提示&#xff09;1、zsh-autosuggestions&#xff08;需下载安装&#xff09;&#xff1a;高亮显示所有支持的命…

计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Llama旋转位置编码代码实现及详解

旋转位置编码RoPE 在旋转位置编码与Transformer和BERT之间的区别中介绍了旋转位置编码&#xff08;RoPE&#xff09;的特点和优势&#xff0c;这种输入长度动态可变的优势使得在Llama编码时&#xff0c;不需要掩码将多余的嵌入掩住。为了详细了解RoPE是如何实现的&#xff0c;…

如何保证Redis与MySQL双写一致性

什么是双写一致性问题&#xff1f; 双写一致性主要指在一个数据同时存在于缓存&#xff08;如Redis&#xff09;和持久化存储&#xff08;如MySQL&#xff09;的情况下&#xff0c;任何一方的数据更新都必须确保另一方数据的同步更新&#xff0c;以保持双方数据的一致状态。这一…

STM32获取SHT3X温湿度芯片数据

目录 一、概述 二、单次数据采集模式的测量 1、配置说明 2、代码实现方式 三、周期性数据采集模式的测量 1、配置说明 2、代码实现方式 四、完整代码下载链接 一、概述 SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器&#xff0c;基于CMOSens技术。它提…

计算机新手练级攻略——善用搜索引擎

计算机学生新手练级攻略——善用搜索引擎 在信息爆炸的时代&#xff0c;计算机专业的学生如何有效地自我提升&#xff1f;答案可能就藏在一个简单却强大的工具——搜索引擎中。搜索引擎不仅是获取知识的入口&#xff0c;更是解决问题的利器。下面&#xff0c;我将分享一些善用搜…

【MySQL】数据库表连接简明解释

未经许可,不得转载。 文章目录 表连接表连接的类型内连接与外连接结合 WHERE 条件交叉连接(cross join)表连接 在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。 所谓“模型”包括实体(entity) 和关系(relati…

Unity 网格模型及优化

一个模型中可以包含很多网格&#xff0c;一个模型可以由多个网格组成。在Unity3D中一个网格可以由多个子网格&#xff08;Sub-Mesh)组成。 在渲染引擎的时候&#xff0c;每个子网格都要匹配一个材质球来做渲染&#xff0c;实际上一个子网格本身就是一个个普通的模型&#xff0…

恒源云使用手册记录:从服务器下载数据到本地

文章目录 一、xftp下载二、通过Xftp客户端连接站点 一、xftp下载 先下载xftp&#xff1a;下载连接 二、通过Xftp客户端连接站点 右击文件&#xff0c;点击新建 名称可以任意 主机、端口号、用户名 点击这里的复制登录命令 比如我这里得到ssh -p 41604 rooti-2.gpushare.co…

ReactPress:功能全面的开源发布平台

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的&#xff0c;包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的&#xff0c;项目已经开源&#xff0c;项目地址在 …

【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF)

一、 大语言模型的训练过程 预训练阶段&#xff1a;PT&#xff08;Pre training&#xff09;。使用公开数据经过预训练得到预训练模型&#xff0c;预训练模型具备语言的初步理解&#xff1b;训练周期比较长&#xff1b;微调阶段1&#xff1a;SFT&#xff08;指令微调/有监督微调…

Android CarrierConfig 参数项和正则匹配逻辑

背景 在编写CarrierConfig的时候经常出现配置不生效的情况&#xff0c;比如运营商支持大范围的imsi&#xff0c;或者是测试人员写卡位数的问题等等&#xff0c;因此就需要模式匹配&#xff08;包含但不限于正则表达式&#xff09;。 基本概念: 模式匹配涉及定义一个“模式”&a…

Golang | Leetcode Golang题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; func reverseWords(s string) string {length : len(s)ret : []byte{}for i : 0; i < length; {start : ifor i < length && s[i] ! {i}for p : start; p < i; p {ret append(ret, s[start i - 1 - p])}for i < le…

运行WHTools批量启动游戏房间工具提示要安装.Net Framework3.5解决

确认电脑能正常上网 点击下载并安装此功能&#xff0c;开始安装.Net Framework 3.5 安装成功 成功启动WHTools

Xcode 16 使用 pod 命令报错解决方案

原文请点击这个跳转 一、问题现象&#xff1a; 有人会遇到 Xcode 升级到 16 后&#xff0c;新建应用然后使用 pod init 命令会报错如下&#xff1a; Stack Ruby : ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-darwin23]RubyGems : 3.5.22Host : macOS 15.0 (24A335…

STM32WB55RG开发(1)----开发板测试

STM32WB55RG开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载产品特性参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32WB55 & SENSOR是一款基于STM32WB55系列微控制器的评估套件。该套件采用先进的无线通信技术&#xff0c;支…

【广西】《广西壮族自治区本级政务信息化建设和运维项目预算支出标准》(桂财建〔2023〕102号)-省市费用标准解读系列09

《广西壮族自治区本级政务信息化建设和运维项目预算支出标准》&#xff08;桂财建〔2023〕102号&#xff09;是广西壮族自治区财政厅于2023年9月26日发布的费用标准&#xff08;了解更多可直接关注我们咨询&#xff09;。我司基于专业第三方信息化项目造价机构角度&#xff0c;…

前端学习笔记-Ajax篇

第1章:原生AJAX 1.1Ajax简介 AAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势:无刷新获取数据。 AAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用…

HarmonyOS Next 实战卡片开发 02

HarmonyOS Next 实战卡片开发 02 卡片开发中&#xff0c;还有一个难点是显示图片。其中分为显示本地图片和显示网络图片 显示本地图片 卡片可以显示本地图片&#xff0c;如存放在应用临时目录下的图片。路径比如 /data/app/el2/100/base/你的项目boundleName/temp/123.png 以…

将文字转换为运动:使用AMD GPU生成视频指南

Transforming Words into Motion: A Guide to Video Generation with AMD GPU — ROCm Blogs 发布日期: 2024年4月24日 作者: Douglas Jia 本博客介绍了通过增强稳定扩散模型在文本到视频生成方面的进展&#xff0c;并展示了使用阿里巴巴的ModelScopeT2V模型在AMD GPU上生成视频…