2019-07-07 16:53:31

问题描述:

问题求解:

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

 public int[] gridIllumination(int N, int[][] lamps, int[][] queries) {
int[] rows = new int[N];
int[] cols = new int[N];
int[] diag1 = new int[2 * N - 1];
int[] diag2 = new int[2 * N - 1];
Set<String> set = new HashSet<>();
for (int[] lamp : lamps) {
int x = lamp[0];
int y = lamp[1];
rows[x]++;
cols[y]++;
diag1[x + y]++;
diag2[N - 1 - x + y]++;
set.add(String.valueOf(x) + "_" + String.valueOf(y));
}
int n = queries.length;
int[] res = new int[n];
for (int i = 0; i < n; i++) {
int[] q = queries[i];
int x = q[0];
int y = q[1];
if (rows[x] > 0 || cols[y] > 0 || diag1[x + y] > 0 || diag2[N - 1 - x + y] > 0)
res[i] = 1;
else res[i] = 0;
helper(x, y, set, rows, cols, diag1, diag2, N);
}
return res;
} private void helper(int x, int y, Set<String> set, int[] rows, int[] cols, int[] diag1, int[] diag2, int N) {
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
int pi = x + i;
int pj = y + j;
if (pi < 0 || pi >= N || pj < 0 || pj >= N) continue;
String cur = String.valueOf(pi) + "_" + String.valueOf(pj);
if (set.contains(cur)) {
set.remove(cur);
rows[pi]--;
cols[pj]--;
diag1[pi + pj]--;
diag2[N - 1 - pi + pj]--;
}
}
}
}

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

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

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

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

    public int[] gridIllumination(int N, int[][] lamps, int[][] queries) {
HashMap<Integer, Integer> rows, cols, diag1, diag2;
rows = new HashMap<Integer, Integer>();
cols = new HashMap<Integer, Integer>();
diag1 = new HashMap<Integer,Integer>();
diag2 = new HashMap<Integer, Integer>();
Set<Long> set = new HashSet<>();
for (int[] lamp : lamps) {
int x = lamp[0];
int y = lamp[1];
rows.put(x, rows.getOrDefault(x, 0) + 1);
cols.put(y, cols.getOrDefault(y, 0) + 1);
diag1.put(x + y, diag1.getOrDefault(x + y, 0) + 1);
diag2.put(N - 1 - x + y, diag2.getOrDefault(N - 1 - x + y, 0) + 1);
set.add((long)x << 32 | (long)y);
}
int n = queries.length;
int[] res = new int[n];
for (int i = 0; i < n; i++) {
int[] q = queries[i];
int x = q[0];
int y = q[1];
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)
res[i] = 1;
else res[i] = 0;
helper(x, y, set, rows, cols, diag1, diag2, N);
}
return res;
} 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) {
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
int pi = x + i;
int pj = y + j;
if (pi < 0 || pi >= N || pj < 0 || pj >= N) continue;
long cur = (long)pi << 32 | pj;
if (set.contains(cur)) {
set.remove(cur);
rows.put(pi, rows.get(pi) - 1);
cols.put(pj, cols.get(pj) - 1);
diag1.put(pi + pj, diag1.get(pi + pj) - 1);
diag2.put(N - 1 - pi + pj, diag2.get(N - 1 - pi + pj) - 1);
}
}
}
}

  

Grid Illumination的更多相关文章

  1. [Swift]LeetCode1001. 网格照明 | Grid Illumination

    On a N x N grid of cells, each cell (x, y) with 0 <= x < N and 0 <= y < N has a lamp. In ...

  2. 【leetcode】1001. Grid Illumination

    题目如下: On a N x N grid of cells, each cell (x, y) with 0 <= x < N and 0 <= y < N has a la ...

  3. 【LeetCode】1001. Grid Illumination 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 哈希 日期 题目地址:https://leetcod ...

  4. 【LeetCode】Grid Illumination(网格照明)

    这道题是LeetCode里的第1001道题. 题目要求: 在 N x N 的网格上,每个单元格 (x, y) 上都有一盏灯,其中 0 <= x < N 且 0 <= y < N ...

  5. [LeetCode] N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  6. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  7. [LeetCode] 51. N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  8. leetcode hard

    # Title Solution Acceptance Difficulty Frequency     4 Median of Two Sorted Arrays       27.2% Hard ...

  9. 【Leetcode周赛】从contest-121开始。(一般是10个contest写一篇文章)

    Contest 121 (题号981-984)(2019年1月27日) 链接:https://leetcode.com/contest/weekly-contest-121 总结:2019年2月22日 ...

随机推荐

  1. iOS多线程开发之GCD(死锁篇)

    上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...

  2. 表单验证之JQuery Validate控件

    概述 jQuery Validation Plugin v1.14.0,基于JQuery,官网http://jqueryvalidation.org/ 该插件捆绑了一套有用的验证方法,包括 URL 和 ...

  3. linux svn 安装(支持http访问)

    1.安装svn yum install -y subversion 2.查看svn版本 svn --version 3.创建仓库 mkdir -p /opt/java/repos cd /opt/ja ...

  4. Web渗透基础小总结

    Web渗透框架概述 主要组成: 1. web语言代码(脚本) 2. web程序 3. 数据库程序 Web语言常见几大类 1. HTML:超文本标记语言,标准通用编辑语言下的一个应用 2. PHP:超文 ...

  5. 一文了解各大图数据库查询语言(Gremlin vs Cypher vs nGQL)| 操作入门篇

    文章的开头我们先来看下什么是图数据库,根据维基百科的定义:图数据库是使用图结构进行语义查询的数据库,它使用节点.边和属性来表示和存储数据. 虽然和关系型数据库存储的结构不同(关系型数据库为表结构,图数 ...

  6. 工作技术点小计14条 hybrid + animate 方向

    设置transition 动画的时候 , js直接设置duration 和 变化值不会起作用 , 需要先设置duration , 等一小会再设置变化值 安卓端 , 窗口不可见时 , window.in ...

  7. 用mpvue写个玩意儿玩玩

    下周公司要搞黑客马拉松了,组里可能会做个小程序.然后看到了mpvue感觉还不错,于是就打算试试水.用vue写小程序听上去美滋滋.那么先开始吧! 全局安装 vue-cli $ npm install - ...

  8. Django中的session的使用

    一.Session 的概念 cookie 是在浏览器端保存键值对数据,而 session 是在服务器端保存键值对数据 session 的使用依赖 cookie:在使用 Session 后,会在 Coo ...

  9. volatile关键字的理解

    volatile是java语言提供的一种稍弱的同步机制,它的作用是能够保证被volatile修饰的变量,每个线程在获取它的值时都能获取到最新的值. 要理解这个原理首先要知道java内存模型:每个线程都 ...

  10. Java 8 Optional 良心指南,建议收藏

    想学习,永远都不晚,尤其是针对 Java 8 里面的好东西,Optional 就是其中之一,该类提供了一种用于表示可选值而非空引用的类级别解决方案.作为一名 Java 程序员,我真的是烦透了 Null ...