2023-06-26:在大小为 n x n 的网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态

给你一个由灯的位置组成的二维数组 lamps

其中 lamps[i] = [rowi, coli] 表示 打开 位于 grid[rowi][coli] 的灯

即便同一盏灯可能在 lamps 中多次列出,不会影响这盏灯处于 打开 状态

当一盏灯处于打开状态,它将会照亮 自身所在单元格

以及同一 行 、同一 列 和两条 对角线 上的 所有其他单元格

另给你一个二维数组 queries ,其中 queries[j] = [rowj, colj]

对于第 j 个查询,如果单元格 [rowj, colj] 是被照亮的

则查询结果为 1 ,否则为 0 。在第 j 次查询之后 [按照查询的顺序]

关闭 位于单元格 grid[rowj][colj] 上

及相邻 8 个方向上(与单元格 grid[rowi][coli] 共享角或边)的任何灯。

返回一个整数数组 ans 作为答案, ans[j] 应等于第 j 次查询 queries[j] 的结果.

1 表示照亮,0 表示未照亮。

输入:n = 5, lamps = [[0,0],[4,4]], queries = [[1,1],[1,0]]。

输出:[1,0]。

答案2023-06-26:

大体步骤如下:

1.首先,定义一个存储灯位置的二维数组 lamps,和查询位置的二维数组 queries。

2.创建四个map,用于记录每行、每列、左上到右下对角线和右上到左下对角线上的灯的数量。还有一个points map,用于存储所有点的状态。

3.遍历灯的位置,将灯的状态记录到相关的map中,并将点的状态记录到points map中。

4.创建一个结果数组 ans,用于存储每个查询的结果。

5.对于每一个查询位置,初始化结果为0。

6.如果查询位置所在的行、列、左上到右下对角线或者右上到左下对角线上有灯,将结果设为1。

7.遍历查询位置周围的8个方向,如果有灯,则关闭该灯,并在相关的map中减去相应的数量。

8.返回结果数组 ans。

时间复杂度分析:

  • 遍历灯的位置并初始化maps需要 O(lamps),其中 lamps 是灯的数量。

  • 对于每个查询位置,遍历周围的8个方向,检查是否有灯需要 O(1) 的时间。

  • 因此,总的时间复杂度为 O(lamps + queries)。

空间复杂度分析:

  • maps 和 points 的空间复杂度均为 O(lamps),其中 lamps 是灯的数量。

  • 结果数组 ans 的空间复杂度为 O(queries),其中 queries 是查询的数量。

  • 因此,总的空间复杂度为 O(lamps + queries)。

go完整代码如下:

  1. package main
  2. import "fmt"
  3. var move = [][]int{
  4. {0, 0},
  5. {0, -1},
  6. {0, 1},
  7. {-1, 0},
  8. {-1, -1},
  9. {-1, 1},
  10. {1, 0},
  11. {1, -1},
  12. {1, 1},
  13. }
  14. func gridIllumination(n int, lamps [][]int, queries [][]int) []int {
  15. limit := int64(n)
  16. row := make(map[int]int)
  17. col := make(map[int]int)
  18. leftUpDiag := make(map[int]int)
  19. rightUpDiag := make(map[int]int)
  20. points := make(map[int64]bool)
  21. for _, p := range lamps {
  22. if points[limit*int64(p[0])+int64(p[1])] == false {
  23. points[limit*int64(p[0])+int64(p[1])] = true
  24. row[p[0]]++
  25. col[p[1]]++
  26. leftUpDiag[p[0]-p[1]]++
  27. rightUpDiag[p[0]+p[1]]++
  28. }
  29. }
  30. ans := make([]int, len(queries))
  31. for i, q := range queries {
  32. ans[i] = 0
  33. if row[q[0]] != 0 || col[q[1]] != 0 || leftUpDiag[q[0]-q[1]] != 0 || rightUpDiag[q[0]+q[1]] != 0 {
  34. ans[i] = 1
  35. }
  36. for _, m := range move {
  37. r := q[0] + m[0]
  38. c := q[1] + m[1]
  39. lu := r - c
  40. ru := r + c
  41. if r < 0 || r >= n || c < 0 || c >= n {
  42. continue
  43. }
  44. if points[limit*int64(r)+int64(c)] {
  45. points[limit*int64(r)+int64(c)] = false
  46. minusOrRemove(row, r)
  47. minusOrRemove(col, c)
  48. minusOrRemove(leftUpDiag, lu)
  49. minusOrRemove(rightUpDiag, ru)
  50. }
  51. }
  52. }
  53. return ans
  54. }
  55. func minusOrRemove(m map[int]int, key int) {
  56. if m[key] == 1 {
  57. delete(m, key)
  58. } else {
  59. m[key]--
  60. }
  61. }
  62. func main() {
  63. n := 5
  64. lamps := [][]int{{0, 0}, {4, 4}}
  65. queries := [][]int{{1, 1}, {1, 0}}
  66. result := gridIllumination(n, lamps, queries)
  67. fmt.Println(result)
  68. }

rust完整代码如下:

  1. use std::collections::{HashMap, HashSet};
  2. fn grid_illumination(n: i32, lamps: Vec<Vec<i32>>, queries: Vec<Vec<i32>>) -> Vec<i32> {
  3. let limit = n;
  4. let mut row = HashMap::new();
  5. let mut col = HashMap::new();
  6. let mut left_up_diag = HashMap::new();
  7. let mut right_up_diag = HashMap::new();
  8. let mut points = HashSet::new();
  9. for p in lamps {
  10. if points.insert(limit * p[0] + p[1]) {
  11. *row.entry(p[0]).or_insert(0) += 1;
  12. *col.entry(p[1]).or_insert(0) += 1;
  13. *left_up_diag.entry(p[0] - p[1]).or_insert(0) += 1;
  14. *right_up_diag.entry(p[0] + p[1]).or_insert(0) += 1;
  15. }
  16. }
  17. let mut ans = Vec::with_capacity(queries.len());
  18. for q in queries {
  19. let mut illumination = 0;
  20. if row.contains_key(&q[0])
  21. || col.contains_key(&q[1])
  22. || left_up_diag.contains_key(&(q[0] - q[1]))
  23. || right_up_diag.contains_key(&(q[0] + q[1]))
  24. {
  25. illumination = 1;
  26. }
  27. for m in vec![
  28. vec![0, 0],
  29. vec![0, -1],
  30. vec![0, 1],
  31. vec![-1, 0],
  32. vec![-1, -1],
  33. vec![-1, 1],
  34. vec![1, 0],
  35. vec![1, -1],
  36. vec![1, 1],
  37. ] {
  38. let r = q[0] + m[0];
  39. let c = q[1] + m[1];
  40. let lu = r - c;
  41. let ru = r + c;
  42. if r < 0 || r >= n || c < 0 || c >= n {
  43. continue;
  44. }
  45. if points.contains(&(limit * r + c)) {
  46. points.remove(&(limit * r + c));
  47. minus_or_remove(&mut row, r);
  48. minus_or_remove(&mut col, c);
  49. minus_or_remove(&mut left_up_diag, lu);
  50. minus_or_remove(&mut right_up_diag, ru);
  51. }
  52. }
  53. ans.push(illumination);
  54. }
  55. ans
  56. }
  57. fn minus_or_remove(map: &mut HashMap<i32, i32>, key: i32) {
  58. if let Some(count) = map.get_mut(&key) {
  59. if *count == 1 {
  60. map.remove(&key);
  61. } else {
  62. *count -= 1;
  63. }
  64. }
  65. }
  66. fn main() {
  67. let n = 5;
  68. let lamps = vec![vec![0, 0], vec![4, 4]];
  69. let queries = vec![vec![1, 1], vec![1, 0]];
  70. let result = grid_illumination(n, lamps, queries);
  71. println!("{:?}", result);
  72. }

c++完整代码如下:

  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <unordered_set>
  5. using namespace std;
  6. vector<vector<int>> move222 = {
  7. {0, 0},
  8. {0, -1},
  9. {0, 1},
  10. {-1, 0},
  11. {-1, -1},
  12. {-1, 1},
  13. {1, 0},
  14. {1, -1},
  15. {1, 1}
  16. };
  17. void minusOrRemove(unordered_map<int, int>& map, int key) {
  18. if (map[key] == 1)
  19. map.erase(key);
  20. else
  21. map[key]--;
  22. }
  23. vector<int> gridIllumination(int n, vector<vector<int>>& lamps, vector<vector<int>>& queries) {
  24. long limit = n;
  25. unordered_map<int, int> row, col, leftUpDiag, rightUpDiag;
  26. unordered_set<long long> points;
  27. for (vector<int>& p : lamps) {
  28. if (points.insert(limit * p[0] + p[1]).second) {
  29. row[p[0]]++;
  30. col[p[1]]++;
  31. leftUpDiag[p[0] - p[1]]++;
  32. rightUpDiag[p[0] + p[1]]++;
  33. }
  34. }
  35. vector<int> ans(queries.size());
  36. int ansi = 0;
  37. for (vector<int>& q : queries) {
  38. ans[ansi++] = (row.count(q[0]) || col.count(q[1]) || leftUpDiag.count(q[0] - q[1]) || rightUpDiag.count(q[0] + q[1])) ? 1 : 0;
  39. for (vector<int>& m : move222) {
  40. int r = q[0] + m[0];
  41. int c = q[1] + m[1];
  42. int lu = r - c;
  43. int ru = r + c;
  44. if (r < 0 || r >= n || c < 0 || c >= n)
  45. continue;
  46. if (points.count(limit * r + c)) {
  47. points.erase(limit * r + c);
  48. minusOrRemove(row, r);
  49. minusOrRemove(col, c);
  50. minusOrRemove(leftUpDiag, lu);
  51. minusOrRemove(rightUpDiag, ru);
  52. }
  53. }
  54. }
  55. return ans;
  56. }
  57. int main() {
  58. int n = 5;
  59. vector<vector<int>> lamps = { {0, 0}, {4, 4} };
  60. vector<vector<int>> queries = { {1, 1}, {1, 0} };
  61. vector<int> result = gridIllumination(n, lamps, queries);
  62. for (const int& res : result) {
  63. cout << res << " ";
  64. }
  65. cout << endl;
  66. return 0;
  67. }

c完整代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct {
  4. int x;
  5. int y;
  6. } Lamp;
  7. int move[9][2] = {
  8. {0, 0},
  9. {0, -1},
  10. {0, 1},
  11. {-1, 0},
  12. {-1, -1},
  13. {-1, 1},
  14. {1, 0},
  15. {1, -1},
  16. {1, 1}
  17. };
  18. void minusOrRemove(int* map, int key) {
  19. if (map[key] == 1) {
  20. map[key] = 0;
  21. }
  22. else {
  23. map[key]--;
  24. }
  25. }
  26. int* gridIllumination(int n, Lamp* lamps, int lampsSize, int* lampsColSize, int** queries, int queriesSize, int* queriesColSize, int* returnSize) {
  27. long limit = n;
  28. int* row = (int*)calloc(n, sizeof(int));
  29. int* col = (int*)calloc(n, sizeof(int));
  30. int* leftUpDiag = (int*)calloc(2 * n - 1, sizeof(int));
  31. int* rightUpDiag = (int*)calloc(2 * n - 1, sizeof(int));
  32. int* points = (int*)calloc(n * n, sizeof(int));
  33. for (int i = 0; i < lampsSize; i++) {
  34. int x = lamps[i].x;
  35. int y = lamps[i].y;
  36. if (points[limit * x + y] == 0) {
  37. points[limit * x + y] = 1;
  38. row[x]++;
  39. col[y]++;
  40. leftUpDiag[x - y + n - 1]++;
  41. rightUpDiag[x + y]++;
  42. }
  43. }
  44. int* ans = (int*)calloc(queriesSize, sizeof(int));
  45. for (int i = 0; i < queriesSize; i++) {
  46. int x = queries[i][0];
  47. int y = queries[i][1];
  48. ans[i] = (row[x] || col[y] || leftUpDiag[x - y + n - 1] || rightUpDiag[x + y]) ? 1 : 0;
  49. for (int j = 0; j < 9; j++) {
  50. int r = x + move[j][0];
  51. int c = y + move[j][1];
  52. int lu = r - c + n - 1;
  53. int ru = r + c;
  54. if (r < 0 || r >= n || c < 0 || c >= n) {
  55. continue;
  56. }
  57. if (points[limit * r + c] == 1) {
  58. points[limit * r + c] = 0;
  59. minusOrRemove(row, r);
  60. minusOrRemove(col, c);
  61. minusOrRemove(leftUpDiag, lu);
  62. minusOrRemove(rightUpDiag, ru);
  63. }
  64. }
  65. }
  66. free(row);
  67. free(col);
  68. free(leftUpDiag);
  69. free(rightUpDiag);
  70. free(points);
  71. *returnSize = queriesSize;
  72. return ans;
  73. }
  74. int main() {
  75. int n = 5;
  76. int lampsSize = 2;
  77. int lampsColSize[2] = { 2, 2 };
  78. Lamp lamps[2] = { {0, 0}, {4, 4} };
  79. int queriesSize = 2;
  80. int queriesColSize[2] = { 2, 2 };
  81. int** queries = (int**)malloc(queriesSize * sizeof(int*));
  82. for (int i = 0; i < queriesSize; i++) {
  83. queries[i] = (int*)malloc(2 * sizeof(int));
  84. }
  85. queries[0][0] = 1;
  86. queries[0][1] = 1;
  87. queries[1][0] = 1;
  88. queries[1][1] = 0;
  89. int returnSize;
  90. int* result = gridIllumination(n, lamps, lampsSize, lampsColSize, queries, queriesSize, queriesColSize, &returnSize);
  91. for (int i = 0; i < returnSize; i++) {
  92. printf("%d ", result[i]);
  93. }
  94. printf("\n");
  95. for (int i = 0; i < queriesSize; i++) {
  96. free(queries[i]);
  97. }
  98. free(queries);
  99. free(result);
  100. return 0;
  101. }

2023-06-26:在大小为 n x n 的网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态 给你一个由灯的位置组成的二维数组 lamps 其中 lamps[i] = [rowi,的更多相关文章

  1. 使用一个for循环将N*N的二维数组的所有值置1

    <?php // 使用一个for循环将N*N的二维数组的所有值置1 $n = ; $a = []; ;$i<$n*$n;$i++){ $a[$i/$n][$i%$n] = ; } prin ...

  2. 一个有用的排序函数,array_multisort(),下面的一个用法是根据二维数组里的一个字段值的大小,对该二维数组进行重新排序

    从二维数组$cashes中取出一列 'store_id'(二维数组中的每个一维数组都有的字段),按照这个的大小排序,对二维数组$caches里面的一维数组进行重新排序 实际应用如下 想让相同部门的排在 ...

  3. LeetCode二维数组中的查找

    LeetCode 二维数组中的查找 题目描述 在一个 n*m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增.请完成一个搞笑的函数,输入这样的一个二维数组和一个整数,判断数 ...

  4. C语言基础--二维数组

    二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...

  5. C Program基础-二维数组

    一维数组可以看作一行连续的数据,只有一个下标.C语言允许构造二维数组甚至多维数组,在实际问题中有时候常常需要用到二维数组(例如数学上的矩阵),二维数组有两个下标,以确定某个元素在数组中的位置. (一) ...

  6. 【剑指 Offer】04.二维数组中的查找

    题目描述 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  7. 剑指 Offer 04. 二维数组中的查找

    链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 标签:数组.双指针.二分 题目 在一个 n * m ...

  8. 剑指offer-面试题3.二维数组中的查找

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增 的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数. 算法流程如下: 比如一个 ...

  9. nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战

    前天在玩OLED时想完成一直想弄得一个东西,就是简单的单片机游戏.因为STM32和nRF51822的内存足够,所以就用缓存数组的方法来显示图像(我也不知道术语是啥,反正就是在内存中建立一个128X64 ...

  10. c#简单实现二维数组和二维数组列表List&lt;&gt;的转置

    刚看到网上一篇文章里用sql实现了行列转置.sql server 2005/2008只用一个pivot函数就可以实现sql server 2000很多行的复杂实现.提到转置,立刻想起还在求学阶段曾经做 ...

随机推荐

  1. [Java EE]Spring Boot 与 Spring Cloud的关系/过去-现在-未来

    1 微服务架构 定义 微服务 (Microservices) 是一种软件架构风格, 它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础, 利用模块化的方式 ...

  2. DG:RFS[8]: No standby redo logfiles created for thread 2

    环境:两节点的RAC在线搭建DG,处理报错 现象:RFS[8]: No standby redo logfiles created for thread 2 ,thread2 没有建立redo Tue ...

  3. 在smt贴片加工中手工焊接和机器焊接的区别

    在smt贴片加工领域,都需要将电子元件贴装在pcb板表面并进行焊接的,常用的焊接方式分为两种:手动焊接和全自动机器焊接,而常用的焊接机器有回流焊机和波峰焊机,那你知道他们的区别是什么吗?安徽英特丽带你 ...

  4. C# 如何设计一个好用的日志库?【架构篇】

    〇.前言 相信你在实际工作期间经常遇到或听到这样的说法:   "我现在加一下日志,等会儿你再操作下."   "只有在程序出问题以后才会知道打一个好的日志有多么重要.&qu ...

  5. 部署kubernetes-dashboard并配置ServiceAccount和登录鉴权

    "种草" kubernetes-dashboard 安装部署dashboard 创建用于登录面板的ServiceAccount 权限控制 "种草" kubern ...

  6. js 获取窗口/容器内部滚动位置

    前端 (document.getElementsByClassName("container")[0]).scrollTop -- 容器内部滚动条位置 (document.getE ...

  7. [人脸活体检测] 论文:Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection

    Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection 论文简介 该论文提出的方法已经部署到百万台终端,整篇文章底气十足.作者设 ...

  8. 虚拟机中Docker下部署gitlab

    一.安装Gitlab 1.拉取镜像并启动 由于服务器的80端口可能被占用,所以这里我们改成了其他端口来启动 docker run -d -p 2443:443 -p 5678:80 -p 2222:2 ...

  9. 2022-08-19:以下go语言代码输出什么?A:equal;B:not equal;C:不确定。 package main import ( “fmt“ “reflect“ )

    2022-08-19:以下go语言代码输出什么?A:equal:B:not equal:C:不确定. package main import ( "fmt" "refle ...

  10. 2022-01-21:完美矩形。 给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi,

    2022-01-21:完美矩形. 给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形.这个矩形的左下顶点是 (xi, ...