JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2024-09-28
目录

圆和矩形是否有重叠Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

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

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

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

示例 1 : sample_2_1728.png

输入: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 : sample_4_1728.png

输入: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

# 思路

先判断圆心是否在矩形内部,然后判断四条边到圆心的距离是否小于R。

# 解法

class Solution {
    public boolean checkOverlap(int radius, int x_center, int y_center, int x1, int y1, int x2, int y2) {
        if (x_center >= x1 && x_center <= x2 && y_center >= y1 && y_center <= y2)
            return true;    // 圆心在矩形内部
        // y = x1
        int dis = 0, xdiff = 0, ydiff = 0;
        if (y_center < y1 || y_center > y2)
            ydiff = Math.min(Math.abs(y1 - y_center), Math.abs(y2 - y_center));
        dis = (x1 - x_center) * (x1 - x_center) + ydiff * ydiff;
        if (dis <= radius * radius)
            return true;
        // y = x2
        dis = (x2 - x_center) * (x2 - x_center) + ydiff * ydiff;
        if (dis <= radius * radius)
            return true;
        // x = y1
        if (x_center < x1 || x_center > x2)
            xdiff = Math.min(Math.abs(x1 - x_center), Math.abs(x2 - x_center));
        dis = (y1 - y_center) * (y1 - y_center) + xdiff * xdiff;
        if (dis <= radius * radius)
            return true;
        // x = y2
        dis = (y2 - y_center) * (y2 - y_center) + xdiff * xdiff;
        if (dis <= radius * radius)
            return true;
        return false;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
#Java
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式