当前位置:首页 > 力扣 > 【力扣LCR42题解析】套圈游戏:用距离平方优化算法解题

【力扣LCR42题解析】套圈游戏:用距离平方优化算法解题

1天前

【力扣LCR42题解析】套圈游戏:用距离平方优化算法解题 C++代码 力扣题解 力扣LCR题 第1张

一、题目解读

力扣LCR42题“圆圈游戏”要求计算给定玩具集合中,能被套圈覆盖的玩具数量。每个玩具和套圈均由坐标及半径定义,需判断玩具是否在套圈覆盖范围内。题目核心在于高效计算点与圆的位置关系,并统计符合条件的结果。

二、解题思路

采用“半径预筛选+距离平方判定”策略:

1. 过滤无效玩具:优先排除半径大于套圈半径的玩具(因不可能被覆盖)。

2. 逐点验证覆盖:对剩余玩具,遍历所有套圈计算其与圆心距离平方,利用平方避免开方运算,通过比较距离平方与半径差平方判断是否覆盖。

3. 优化计算逻辑:通过提前终止(找到覆盖即break)减少冗余遍历。

三、解题步骤

1. 初始化计数器:count记录被覆盖玩具数量。

2. 外层循环:遍历玩具列表,解析坐标与半径(tx, ty, tr)。

3. 半径过滤:若tr > r(玩具半径大于套圈半径),跳过当前玩具。

4. 内层循环:遍历套圈列表,计算玩具与套圈圆心距离平方(dx^2 + dy^2)。

5. 覆盖判定:若距离平方小于半径差平方(r - tr)^2,标记覆盖并跳出内层循环。

6. 统计结果:若玩具被覆盖,计数器递增。

7. 返回最终数量。

四、代码与注释

#include <vector>
#include <cmath>
using namespace std;

class Solution {
public:
    int circleGame(vector<vector<int>>& toys, vector<vector<int>>& circles, int r) {
        int count = 0; // 初始化覆盖计数
        for (const auto& toy : toys) { // 遍历玩具
            int tx = toy[0], ty = toy[1], tr = toy[2];
            // 玩具半径必须小于等于套圈半径才可能被套住
            if (tr > r) continue;
            
            bool covered = false; // 标记是否被覆盖
            for (const auto& circle : circles) {
                int cx = circle[0], cy = circle[1];
                // 计算两点间距离平方(避免浮点运算)
                long dx = tx - cx, dy = ty - cy;
                long distance_sq = dx * dx + dy * dy;
                long max_distance = r - tr; // 允许最大距离平方
                // 比较距离平方与半径平方差
                if (distance_sq <= max_distance * max_distance) {
                    covered = true;
                    break; // 找到覆盖即终止
                }
            }
            if (covered) count++;
        }
        return count;
    }
};

五、总结

本解法通过半径预筛选降低无效计算,结合距离平方判定避免浮点误差,通过提前终止循环优化时间复杂度。核心在于将几何问题转化为代数比较,兼顾效率与准确性。适用于处理大量坐标与半径的覆盖判定场景。


原创内容 转载请注明出处

分享给朋友:

相关文章

手搓二叉搜索树代码详解:从入门到实现(附完整注释)

一、简介和应用二叉搜索树(Binary Search Tree,BST)是一种经典的数据结构,其特点在于每个节点的左子树所有节点值均小于该节点,右子树所有节点值均大于该节点。这种特性使得它在查找、插入...

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

一、题目解读力扣3115题要求在一个整数数组中,找出两个质数之间的最大差值。若数组不存在质数,则返回0。题目核心在于高效筛选质数,并计算其索引差值的最大值,需兼顾时间与空间复杂度。二、解题思路参考代码...

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

一、题目解读力扣2846题要求解决一个基于图连通性的操作优化问题。给定一个无向图,包含边权重,以及一系列查询,每个查询询问两点间路径的最小操作次数。题目关键在于高效计算路径上权重分布的统计信息,并转化...

【1999NOIP普及组】(洛谷P1016)旅行家的预算解题报告(附代码+注释)

【1999NOIP普及组】(洛谷P1016)旅行家的预算解题报告(附代码+注释)

一、题目解读题目要求解决旅行家从起点到终点(D1公里)的预算问题,需在沿途N个加油站中规划加油策略,使总费用最小化。每个加油站有不同油价和距离,汽车每升油可行驶D2公里,初始油量为C升,终点无加油站。...

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。