LeetCode 1001 网格照明
题目链接:LeetCode 1001 网格照明
题目大意:
题解:
假设一盏灯的坐标为,那么它所在的行的数值为,列的数值为,正对角线的数值为,反对角线的数值为。确定某一直线的唯一数值标识后,我们就可以通过哈希表来记录某一直线所拥有的灯的数目。
遍历,将当前遍历到的灯所在的行,列和正/反对角线拥有灯的数目分别加一,该过程需要进行去重。
遍历,判断当前查询点所在的行,列和正/反对角线是否有灯,如果有,则置,即该点在查询时是被照亮的。然后进行关闭操作,查找查询点所在的八近邻点及它本身是否有灯,如果有,将该点所在的行,列和正/反对角线的灯数目分别减一,并且将灯从网格中去掉。
class Solution {
private:
vector<vector<int>> dirs = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 0}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
public:
vector<int> gridIllumination(int n, vector<vector<int>>& lamps, vector<vector<int>>& queries) {
unordered_map<int, int> row, col, diagonal, antiDiagonal;
auto hash_pii = [](const pair<int, int>& p) -> size_t {
static hash<long long> hash_ll;
return hash_ll(p.first + (static_cast<long long>(p.second) << 32));
};
unordered_set<pair<int, int>, decltype(hash_pii)> lights(0, hash_pii);
for (auto& lamp : lamps) {
if (!lights.count({lamp[0], lamp[1]})) {
lights.insert({lamp[0], lamp[1]});
open(row, col, diagonal, antiDiagonal, lamp);
}
}
vector<int> ans;
for (auto& query : queries) {
if (isLight(row, col, diagonal, antiDiagonal, query)) {
ans.emplace_back(1);
} else {
ans.emplace_back(0);
}
for (auto& dir : dirs) {
int x = query[0] + dir[0], y = query[1] + dir[1];
if (x >= 0 && x < n && y >= 0 && y < n && lights.count({x, y})) {
lights.erase({x, y});
vector<int> lamp = {x, y};
close(row, col, diagonal, antiDiagonal, lamp);
}
}
}
return ans;
}
bool isLight(unordered_map<int, int>& row, unordered_map<int, int>& col, unordered_map<int, int>& diagonal, unordered_map<int, int>& antiDiagonal, vector<int>& query) {
return (row.count(query[0]) && row[query[0]]) || (col.count(query[1]) && col[query[1]]) || (diagonal.count(query[0] - query[1]) && diagonal[query[0] - query[1]]) || (antiDiagonal.count(query[0] + query[1]) && antiDiagonal[query[0] + query[1]]);
}
void open(unordered_map<int, int>& row, unordered_map<int, int>& col, unordered_map<int, int>& diagonal, unordered_map<int, int>& antiDiagonal, vector<int>& lamp) {
row[lamp[0]]++;
col[lamp[1]]++;
diagonal[lamp[0] - lamp[1]]++;
antiDiagonal[lamp[0] + lamp[1]]++;
}
void close(unordered_map<int, int>& row, unordered_map<int, int>& col, unordered_map<int, int>& diagonal, unordered_map<int, int>& antiDiagonal, vector<int>& lamp) {
row[lamp[0]]--;
col[lamp[1]]--;
diagonal[lamp[0] - lamp[1]]--;
antiDiagonal[lamp[0] + lamp[1]]--;
}
};
分类:
LeetCode题集
标签:
哈希,HASH
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理