【1401. 圆和矩形是否有重叠】

news2024/11/15 19:47:50

来源:力扣(LeetCode)

描述:

给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ,其中 (x1, y1) 是矩形左下角的坐标,而 (x2, y2) 是右上角的坐标。

如果圆和矩形有重叠的部分,请你返回 true ,否则返回 false 。

换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。

示例 1 :
1

输入:radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
输出:true
解释:圆和矩形存在公共点 (1,0)

示例 2 :

输入:radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
输出:false

示例 3 :

2

输入:radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
输出:true

提示:

  • 1 <= radius <= 2000
  • -104 <= xCenter, yCenter <= 104
  • -104 <= x1 < x2 <= 104
  • -104 <= y1 < y2 <= 104

方法一:分区域讨论

思路

在思考这个问题之前,我们先考虑一种临界情况:什么时候圆和矩形只有一个公共点呢?有两种情况:

  • 圆「贴」在矩形的四周
  • 圆「顶」在矩形的顶点

设圆心的坐标为 (x, y),圆的半径为 r, 矩形的左下端点为 (x1, y1),右上端点为 (x2, y2),形式化地,这两种情况可以继续细分:

  • 圆「贴」在矩形的四周
    • x = x1 − r, y ∈ [y1 , y2]
    • x = x2 + r, y ∈ [y1 , y2]
    • y = y1 − r, x ∈ [x1 , x2]
    • y = y2 + r, x ∈ [x1 , x2]
  • 圆「顶」在矩形的顶点
    • (x − x1)2 + (y − y1)2 = r2 , x ∈ [x1 − r, x], y ∈ [y1 − r, y]
    • (x − x2)2 + (y − y1)2 = r2 , x ∈ [x2, x2 + r], y ∈ [y1 − r, y]
    • (x − x1)2 + (y − y2)2 = r2 , x ∈ [x1 − r, x], y ∈ [y2, y2 + r]
    • (x − x2)2 + (y − y2)2 = r2 , x ∈ [x2, x2 + 2], y ∈ [y2, y2 + r]

由此可见,圆心临界位置的轨迹是一个「圆角矩形」——如果我们尝试把圆心向「圆角矩形」内部移动,就一定会出现公共点;如果向「圆角矩形」外部移动,就不会出现公共点。那么问题就转化成了判断圆心是否在这个圆角矩形内,如果在就表示有公共点,否则没有公共点。

3

对于这个圆角矩形我们可以分成九个部分来讨论:

  • 圆心在中心矩形中:x ∈ [x1 , x2], y ∈ [y1 , y2]
  • 圆心在上部矩形中:x ∈ [x1 , x2], y ∈ [y1 , y2 + r]
  • 圆心在下部矩形中:x ∈ [x1 , x2], y ∈ [y1 - r , y2]
  • 圆心在左部矩形中:x ∈ [x1 - r , x2], y ∈ [y1 , y2]
  • 圆心在右部矩形中:x ∈ [x1 , x2 + r], y ∈ [y1 , y2]
  • 圆心在左下方圆角中:(x − x1)2 + (y − y1)2 ≤ r2 , x ∈ [x1 − r, x], y ∈ [y1 − r, y]
  • 圆心在右下方圆角中:(x − x2)2 + (y − y1)2 ≤ r2 , x ∈ [x2, x2 + r], y ∈ [y1 − r, y]
  • 圆心在左上方圆角中:(x − x1)2 + (y − y2)2 ≤ r2 , x ∈ [x1 − r, x], y ∈ [y2, y2 + r]
  • 圆心在右上方圆角中:(x − x2)2 + (y − y2)2 ≤ r2 , x ∈ [x2, x2 + 2], y ∈ [y2, y2 + r]

对于上述情况我们分别进行讨论,由于在判断圆角的情况时,已经判断过五种矩形内的情况,所以不需要再分别讨论横坐标和纵坐标的取值范围,直接判断圆心到顶点的距离即可。

代码:

class Solution {
public:
    long long distance(int ux, int uy, int vx, int vy) {
        return (long long)pow(ux - vx, 2) + (long long)pow(uy - vy, 2);
    }

    bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        /* 圆心在矩形内部 */
        if (x1 <= xCenter && xCenter <= x2 && y1 <= yCenter && yCenter <= y2) {
            return true;
        }
        /* 圆心在矩形上部*/
        if (x1 <= xCenter && xCenter <= x2 && y2 <= yCenter && yCenter <= y2 + radius) {
            return true;
        }
        /* 圆心在矩形下部*/
        if (x1 <= xCenter && xCenter <= x2 && y1 - radius <= yCenter && yCenter <= y1) {
            return true;
        }
        /* 圆心在矩形左部*/
        if (x1 - radius <= xCenter && xCenter <= x1 && y1 <= yCenter && yCenter <= y2) {
            return true;
        }
        /* 圆心在矩形右部*/
        if (x2 <= xCenter && xCenter <= x2 + radius && y1 <= yCenter && yCenter <= y2) {
            return true;
        }
        /* 矩形左上角 */
        if (distance(xCenter, yCenter, x1, y2) <= radius * radius)  {
            return true;
        }
        /* 矩形左下角 */
        if (distance(xCenter, yCenter, x1, y1) <= radius * radius) {
            return true;
        }
        /* 矩形右上角 */
        if (distance(xCenter, yCenter, x2, y2) <= radius * radius) {
            return true;
        }
        /* 矩形右下角 */
        if (distance(xCenter, yCenter, x1, y2) <= radius * radius) {
            return true;
        }
        /* 无交点 */
        return false;
    }
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.7 MB, 在所有 C++ 提交中击败了95.54%的用户
复杂度
时间复杂度:O(1)。
空间复杂度:O(1)。

方法二:求圆心到矩形区域的最短距离

思路

在求圆和直线的位置关系时,我们常常会计算圆心到直线的垂直线段的距离。这条垂直线段的距离小于半径的时候,就说明两者相交。更进一步地考虑,其实是因为这条垂直线段的长度已经是圆心到直线上任意点中最小的了,如果最小的线段长度比圆半径小,说明存在点在圆内。

我们可以类比这个思想,来计算求圆心到矩形区域的最短距离。

我们可以分解成两个问题,即圆心到区域 x1 ≤ x ≤ x2 的最小值 xmin ,和圆心到区域 y1 ≤ y ≤ y2 的最小值 ymin ,我们可以得到这样的关系:

4

圆心到矩形区域的最小距离就是 x m i n 2 + y m i n 2 \sqrt{x^2_{min} + y^2_{min}} xmin2+ymin2 。未了方便理解,我们可以把平面区域根据 x = x1 、x = x2 、y = y1 、y = y2 四条直线分割成九个区域,分类讨论就可以合并到这个结果。

得到这个距离之后,我们再和半径比较,如果这个距离不大于半径的话,就说明存在公共点。

代码:

class Solution {
public:
    bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        long long dist = 0;
        if (xCenter < x1 || xCenter > x2) {
            dist += min(pow(x1 - xCenter, 2), pow(x2 - xCenter, 2));
        }
        if (yCenter < y1 || yCenter > y2) {
            dist += min(pow(y1 - yCenter, 2), pow(y2 - yCenter, 2));
        }
        return dist <= radius * radius;
    }
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.6 MB, 在所有 C++ 提交中击败了99.01%的用户
复杂度
时间复杂度:O(1)。
空间复杂度:O(1)。
author:LeetCode-Solution

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

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

相关文章

灰狼优化算法GWO,优化VMD,适应度函数为最小样本熵或最小包络熵(可自行选择,代码已集成好,很方便修改)包含MATLAB源代码

近期评论区有小伙伴私信需要灰狼优化算法GWO法化VMD的&#xff0c;所以打算再写一篇。 与之前的文章不同&#xff0c;这篇文章作者考虑到&#xff0c;大家有可能会以最小样本熵或最小包络熵为适应度函数的&#xff0c;在这个程序中将会直接把样本熵和包络熵集成&#xff0c;在…

了解Facebook的算法如何工作,提高您的帖子曝光率

Facebook是全球最大的社交媒体平台之一&#xff0c;每天有数亿用户在上面发布内容、互动交流。然而&#xff0c;由于用户数量巨大&#xff0c;每天产生的信息量也是相当惊人的。 为了让用户看到最有用和最相关的内容&#xff0c;Facebook采用了一种复杂的算法来过滤和排序用户…

迅为RK3568开发板Buildroot 系统设置状态栏

Weston 支持在 weston.ini 配置文件的 shell 段设置状态栏的背景色、位置,以及在 launcher 段设置快捷启动程序&#xff0c;修改文件系统的/etc/xdg/weston/weston.ini 文件&#xff0c;如下所示&#xff1a; [shell] # 颜色格式为 ARGB8888 panel-color0xff002244 # top|…

【新星计划回顾】第八篇学习-多表联表查询(完结)

&#x1f3c6;&#x1f3c6;时间过的真快&#xff0c;这是导师回顾新星计划学习的第八篇文章&#xff01; 在学习过程中&#xff0c;学员们也咨询了很多问题&#xff0c;我把一些问题整理以文章形式总结分享下。 最近这段时间非常忙&#xff0c;虽然导师首次参与新星计划活动已…

[内核笔记1]内核文件结构与缓存——inode和对应描述

由来&#xff1a;公司内部外网记录日志的方式现在都是通过Nginx模块收到数据发送到系统消息队列&#xff0c;然后由另外一个进程来从消息队列读取然后写回磁盘这样的操作&#xff0c;尽量的减少Nginx的阻塞。 但是由于System/V消息队列在使用前需要规定消息长度&#xff0c;且…

从古欧洲的四大族群变迁梳理欧洲两千年历史脉络

我们看今天的欧洲&#xff0c;不难发现有几种完全不同的生活方式和行为习惯&#xff0c;以北欧三国再加英德与荷兰等国人为代表&#xff0c;他们信奉新教&#xff0c;勤劳&#xff0c;做事一丝不苟&#xff0c;颇为绅士&#xff0c;所以瑞典、英国、德国创造出了极其辉煌的工业…

canvas判断画笔是否铺满区域

判断画布形状是否填满和百分比 <body> <canvas id"myCanvas" width"300" height"150" style"border:1px solid #d3d3d3;"> </canvas> <script> var cdocument.getElementById("myCanvas"); var ctx…

智慧水务调度系统-智慧水务大数据可视化管理系统

平台概述 智慧水务调度系统平台&#xff08;智慧水务大数据可视化管理系统平台&#xff09;是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心&#xff0c;以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧…

数据库模型设计案例分享(GaussDB版)

目录 一、前言 二、应用系统数据库设计的基本流程 三、数据库模型设计 1、概念结构设计阶段 2、逻辑结构设计阶段 3、物理结构设计阶段 四、小结 一、前言 GaussDB数据库是一款企业级分布式数据库&#xff0c;支持集中式和分布式两种部署形态。它面向金融互联网交易和政…

面试官:说下简历中提到的优化……

作者&#xff1a;张力尹 先来点废话&#xff1a; 听说最近 Android 岗位变多了&#xff0c;你去面试了么&#xff1f; 面试官&#xff1a;你简历中提到了卡顿优化&#xff0c;做了哪些优化呢&#xff0c;展开说说。 你&#xff1a;哦&#xff0c;脑子飞速闪过网上的文章&#x…

Python模块pytest全局初始化和局部初始化前置后置操作

在 pytest 中&#xff0c;我们可以通过 conftest.py 文件来实现全局的前置和后置操作。 conftest.py 文件是一个特殊的 pytest 文件&#xff0c;它可以定义一些 fixture 和钩子函数&#xff0c;这些 fixture 和钩子函数可以在当前目录及其子目录下的所有测试文件中使用。 下面…

VR全景如何制作,可以用在哪些领域?

引言&#xff1a; 虚拟现实&#xff08;VR&#xff09;全景制作正在以惊人的速度改变着我们的感官体验。通过VR全景技术&#xff0c;我们可以身临其境地探索虚拟世界&#xff0c;感受前所未有的沉浸式体验。 一&#xff0e;如何进行VR全景制作 1.什么是VR全景制作&#xff1f…

【雕爷学编程】Arduino动手做(127)---2004A LCD液晶屏模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【状态估计】基于卡尔曼滤波器和扩展卡尔曼滤波器用于 INS/GNSS 导航、目标跟踪和地形参考导航研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

计算机网络——自顶向下方法(第五章学习记录)

本章学习网络层&#xff1a;控制平面 控制平面作为一种网络范围的逻辑&#xff0c;不仅控制沿着从源主机到目的主机的端到端路径间路由器如何转发数据报&#xff0c;而且控制网络层组件和服务如何配置和管理。 概述 通过前面的学习&#xff0c;我们已经知道转发表&#xff0…

Android使用echart展示图表

Android使用echart展示酷炫的图表 最近开发的时候&#xff0c;遇到了柱状图&#xff0c;刻度图等各种图表的展示。查资料发现&#xff0c;Android用的的最多的是MPAndroidChart&#xff0c;我也尝试了&#xff0c;一般的柱状图和饼状图都可以实现&#xff0c;但是刻度图就不行…

【复习《剑指Offer》1-5题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第六天 6/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

第二章:项目环境搭建【基于Servlet+JSP的图书管理系统】

环境搭建 1.项目工具 本项目涉及到的工具都有在云盘提供&#xff0c;自行下载即可 JDK8IDEA2021Tomcat8.5MySQL的客户端工具SQLYog… 2.项目搭建 通过IDEA创建maven项目。勾选脚手架工具。选择maven-archetype-webapp 设置项目的基础信息 3.基本配置 3.1 JDK配置 JDK使用的…

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框&#xff0c; 请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13108 效果图如下&#xff1a; # cc-serviceDialog 自定义服务说明弹窗 自下而上 底部弹窗 #### 使用方法 使用方法 <!-- 服务…

开发吐槽,谁说测试是二等公民,我们才是好吧

很多测试都认为自己是团队中的二等公民&#xff0c;从而各种看衰作贱自己。 这不&#xff0c;昨天在知乎上就看到一篇帖子&#xff1a;一女测试在团队中各种嘲讽自己的测试团队&#xff0c;“测试是低人一等的职业”&#xff0c;时刻劝说大家转开发。最后团队领导受不了&#…