leetcode 1401. 圆和矩形是否有重叠 中等

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

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

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

示例 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 :

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

提示:

  • 1 <= radius <= 2000
  • -10^4 <= xCenter, yCenter <= 10^4
  • -10^4 <= x1 < x2 <= 10^4
  • -10^4 <= y1 < y2 <= 10^4

分析:分类讨论。判断圆与矩形的四条边是否有相交,再判断圆是否与矩形的四个角有重叠部分。

cpp 复制代码
bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
    if(yCenter+radius<y1||yCenter-radius>y2||xCenter+radius<x1||xCenter-radius>x2)return false;
    if((xCenter<=x1&&yCenter<=y1)&&radius*radius<(x1-xCenter)*(x1-xCenter)+(y1-yCenter)*(y1-yCenter))return false;
    if((xCenter>=x2&&yCenter>=y2)&&radius*radius<(x2-xCenter)*(x2-xCenter)+(y2-yCenter)*(y2-yCenter))return false;
    if((xCenter<=x1&&yCenter>=y2)&&radius*radius<(x1-xCenter)*(x1-xCenter)+(y2-yCenter)*(y2-yCenter))return false;
    if((xCenter>=x2&&yCenter<=y1)&&radius*radius<(x2-xCenter)*(x2-xCenter)+(y1-yCenter)*(y1-yCenter))return false;
    return true;
}
相关推荐
hanlin032 小时前
刷题笔记:力扣第76题-最小覆盖子串
笔记·算法·leetcode
随便发挥5 小时前
Leetcode 剑指 Offer II 186. 文物朝代判断
leetcode
6Hzlia5 小时前
【Classic 150 刷题计划】 LeetCode 205. 同构字符串 | C++ 双向绑定与哈希表映射
c++·算法·leetcode
午彦琳18 小时前
2026.9.17
数据结构·算法·leetcode
木井巳18 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法
All for pursuit.21 小时前
【链表-9】146.LRU缓存
数据结构·c++·算法·leetcode
圣保罗的大教堂21 小时前
leetcode 1477. 找两个和为目标值且不重叠的子数组 中等
leetcode
hanlin031 天前
刷题笔记:力扣第144题-二叉树的前序遍历
笔记·算法·leetcode
圣保罗的大教堂1 天前
leetcode 3629. 通过质数传送到达终点的最少跳跃次数 中等
leetcode