Grid Illumination

淡淡的烟草味﹌ 2021-12-03 20:15 340阅读 0赞

2019-07-07 16:53:31

问题描述:

1187314-20190707165431911-618283028.png

1187314-20190707165449994-1462771419.png

问题求解:

本题和n后问题很类似,所以最初的时候就直接套了n后的板子,MLE。

  1. public int[] gridIllumination(int N, int[][] lamps, int[][] queries) {
  2. int[] rows = new int[N];
  3. int[] cols = new int[N];
  4. int[] diag1 = new int[2 * N - 1];
  5. int[] diag2 = new int[2 * N - 1];
  6. Set<String> set = new HashSet<>();
  7. for (int[] lamp : lamps) {
  8. int x = lamp[0];
  9. int y = lamp[1];
  10. rows[x]++;
  11. cols[y]++;
  12. diag1[x + y]++;
  13. diag2[N - 1 - x + y]++;
  14. set.add(String.valueOf(x) + "_" + String.valueOf(y));
  15. }
  16. int n = queries.length;
  17. int[] res = new int[n];
  18. for (int i = 0; i < n; i++) {
  19. int[] q = queries[i];
  20. int x = q[0];
  21. int y = q[1];
  22. if (rows[x] > 0 || cols[y] > 0 || diag1[x + y] > 0 || diag2[N - 1 - x + y] > 0)
  23. res[i] = 1;
  24. else res[i] = 0;
  25. helper(x, y, set, rows, cols, diag1, diag2, N);
  26. }
  27. return res;
  28. }
  29. private void helper(int x, int y, Set<String> set, int[] rows, int[] cols, int[] diag1, int[] diag2, int N) {
  30. for (int i = -1; i <= 1; i++) {
  31. for (int j = -1; j <= 1; j++) {
  32. int pi = x + i;
  33. int pj = y + j;
  34. if (pi < 0 || pi >= N || pj < 0 || pj >= N) continue;
  35. String cur = String.valueOf(pi) + "_" + String.valueOf(pj);
  36. if (set.contains(cur)) {
  37. set.remove(cur);
  38. rows[pi]--;
  39. cols[pj]--;
  40. diag1[pi + pj]--;
  41. diag2[N - 1 - pi + pj]--;
  42. }
  43. }
  44. }
  45. }

那么本题的核心就是如何降低空间复杂度了,如何做呢?

降低空间复杂度有两种常用的技巧:

  1. 将数组转为HashMap,这样就可以在大量稀疏的数组中提取到有用的信息,避免无用的信息。

  2. 如何保存已经点亮的位置,这里采用字符串的处理显然是低效的,最好的方法是采用位操作的方式,使用long将两个int拼接起来达到区分的效果。

  1. public int[] gridIllumination(int N, int[][] lamps, int[][] queries) {
  2. HashMap<Integer, Integer> rows, cols, diag1, diag2;
  3. rows = new HashMap<Integer, Integer>();
  4. cols = new HashMap<Integer, Integer>();
  5. diag1 = new HashMap<Integer,Integer>();
  6. diag2 = new HashMap<Integer, Integer>();
  7. Set<Long> set = new HashSet<>();
  8. for (int[] lamp : lamps) {
  9. int x = lamp[0];
  10. int y = lamp[1];
  11. rows.put(x, rows.getOrDefault(x, 0) + 1);
  12. cols.put(y, cols.getOrDefault(y, 0) + 1);
  13. diag1.put(x + y, diag1.getOrDefault(x + y, 0) + 1);
  14. diag2.put(N - 1 - x + y, diag2.getOrDefault(N - 1 - x + y, 0) + 1);
  15. set.add((long)x << 32 | (long)y);
  16. }
  17. int n = queries.length;
  18. int[] res = new int[n];
  19. for (int i = 0; i < n; i++) {
  20. int[] q = queries[i];
  21. int x = q[0];
  22. int y = q[1];
  23. if (rows.getOrDefault(x, 0) > 0 || cols.getOrDefault(y, 0) > 0 || diag1.getOrDefault(x + y, 0) > 0 || diag2.getOrDefault(N - 1 - x + y, 0) > 0)
  24. res[i] = 1;
  25. else res[i] = 0;
  26. helper(x, y, set, rows, cols, diag1, diag2, N);
  27. }
  28. return res;
  29. }
  30. private void helper(int x, int y, Set<Long> set, HashMap<Integer, Integer> rows, HashMap<Integer, Integer> cols, HashMap<Integer, Integer> diag1, HashMap<Integer, Integer> diag2, int N) {
  31. for (int i = -1; i <= 1; i++) {
  32. for (int j = -1; j <= 1; j++) {
  33. int pi = x + i;
  34. int pj = y + j;
  35. if (pi < 0 || pi >= N || pj < 0 || pj >= N) continue;
  36. long cur = (long)pi << 32 | pj;
  37. if (set.contains(cur)) {
  38. set.remove(cur);
  39. rows.put(pi, rows.get(pi) - 1);
  40. cols.put(pj, cols.get(pj) - 1);
  41. diag1.put(pi + pj, diag1.get(pi + pj) - 1);
  42. diag2.put(N - 1 - pi + pj, diag2.get(N - 1 - pi + pj) - 1);
  43. }
  44. }
  45. }
  46. }

  

转载于:https://www.cnblogs.com/TIMHY/p/11146784.html

发表评论

表情:
评论列表 (有 0 条评论,340人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CSS Grid(1)

    > Grid 由水平线和垂直线构成 > 1、两条水平线中间的区域叫做轨道 > 2、两条垂直线中间的区域叫做列轨道 > 3、行列重叠出来的空间组成单元格 ![在这里

    相关 css grid 布局

    [css grid][] CSS Grid 网格布局 Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。 F

    相关 Grid 布局

    这是一篇快速介绍网站未来布局的文章。 ![CSS Grid 布局][CSS Grid] Grid 布局是网站设计的基础,CSS Grid 是创建网格布局最强大和最简单的工具