Every day a Leetcode
题目来源:2249. 统计圆内格点数目
解法1:枚举
遍历数组 circles,先求出枚举的上下边界。
枚举边界内的所有点,再遍历数组 circles,如果当前点在枚举的圆内, 答案 +1。
最后返回答案。
可以有的优化:先按半径从大到小排序,这样可以更早地遇到包含当前枚举的点的圆。
代码:
/*
* @lc app=leetcode.cn id=2249 lang=cpp
*
* [2249] 统计圆内格点数目
*/
// @lc code=start
class Solution
{
public:
int countLatticePoints(vector<vector<int>> &circles)
{
// 特判
if (circles.empty())
return 0;
// 求枚举的最大、最小边界
int min_x = INT_MAX, min_y = INT_MAX;
int max_x = 0, max_y = 0;
for (vector<int> &circle : circles)
{
int x = circle[0], y = circle[1], r = circle[2];
min_x = min(min_x, x - r);
min_y = min(min_y, y - r);
max_x = max(max_x, x + r);
max_y = max(max_y, y + r);
}
// 枚举点,遇到包含当前点的圆,答案 +1
int ans = 0;
for (int i = min_x; i <= max_x; i++)
for (int j = min_y; j <= max_y; j++)
for (vector<int> &circle : circles)
{
int x = circle[0], y = circle[1], r = circle[2];
if ((x - i) * (x - i) + (y - j) * (y - j) <= r * r)
{
ans++;
break;
}
}
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是数组 circles 的长度。
空间复杂度:O(1)。