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;
}
相关推荐
Pniubi1 小时前
力扣543二叉树的直径(深度优先搜索法(递归))
算法·leetcode·职场和发展
j7~17 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
Shaoshing19 小时前
LeetCode100 42.接雨水
java·算法·leetcode
文丑颜不良啊20 小时前
LeetCode1261~1280题目解析
java·leetcode
Shaoshing21 小时前
LeetCode100 11. 盛最多水的容器
算法·leetcode
海绵宝宝转agent1 天前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先
Rain的Java大神之路1 天前
面试被LeetCode 27(移除元素)问懵?别再用两层 for 循环了:一道“简单题”吃透双指针原地删除,附面试加分话术 + 11 个避坑清单
后端·leetcode·面试
重生之小比特1 天前
【算法拾光】前缀和|连续的子数组和 + 和相同的二元子数组
算法·leetcode·哈希算法
Pniubi1 天前
力扣 102二叉树的层序遍历(广度优先搜索)
leetcode·宽度优先
一去不复返的通信er1 天前
力扣15:盛最多水的容器
算法·leetcode