题目如下:

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

Initially, some number of lamps are on.  lamps[i] tells us the location of the i-th lamp that is on.  Each lamp that is on illuminates every square on its x-axis, y-axis, and both diagonals (similar to a Queen in chess).

For the i-th query queries[i] = (x, y), the answer to the query is 1 if the cell (x, y) is illuminated, else 0.

After each query (x, y) [in the order given by queries], we turn off any lamps that are at cell (x, y) or are adjacent 8-directionally (ie., share a corner or edge with cell (x, y).)

Return an array of answers.  Each value answer[i]should be equal to the answer of the i-th query queries[i].

Example 1:

Input: N = 5, lamps = [[0,0],[4,4]], queries = [[1,1],[1,0]]
Output: [1,0]
Explanation:
Before performing the first query we have both lamps [0,0] and [4,4] on.
The grid representing which cells are lit looks like this, where [0,0] is the top left corner, and [4,4] is the bottom right corner:
1 1 1 1 1
1 1 0 0 1
1 0 1 0 1
1 0 0 1 1
1 1 1 1 1
Then the query at [1, 1] returns 1 because the cell is lit. After this query, the lamp at [0, 0] turns off, and the grid now looks like this:
1 0 0 0 1
0 1 0 0 1
0 0 1 0 1
0 0 0 1 1
1 1 1 1 1
Before performing the second query we have only the lamp [4,4] on. Now the query at [1,0] returns 0, because the cell is no longer lit.

Note:

  1. 1 <= N <= 10^9
  2. 0 <= lamps.length <= 20000
  3. 0 <= queries.length <= 20000
  4. lamps[i].length == queries[i].length == 2

解题思路:每一盏灯可以照亮所在位置的水平方向、垂直方向和两个对角线方向 ,假设这盏灯的坐标是(i,j),那么用一次函数来表示这水平和垂直方向就是x=i,y=j。两个对角线方向很显然斜率分别是1和-1,把(i,j)分别带入方程 y=x+b和y=-x+b即可求出b的值,而(斜率,b)这两个参数即可确定一条直线。这里可以用三个字典分别保存这四个方程,例如dic_x[i] ,dic_y[j], dic[(-1,b)],dic[(1,b)],每亮一盏灯,算出key值并对字典中相应的key所对应的值+1,而灭灯就是对key所对应的值减去1。判断一盏灯是否是亮的状态,算出四个方向的key值并判断这四个key中至少有一个存在于字典中即可。

代码如下:

class Solution(object):
dic = {}
dic_x = {}
dic_y = {}
dic_lamp = {}
def turn_on(self,x,y):
b = y - x
self.dic[(1, b)] = self.dic.setdefault((1, b), 0) + 1
b = x + y
self.dic[(-1, b)] = self.dic.setdefault((-1, b), 0) + 1 self.dic_x[x] = self.dic_x.setdefault(x, 0) + 1
self.dic_y[y] = self.dic_y.setdefault(y, 0) + 1
def turn_off(self,x,y):
b = y - x
if (1,b) in self.dic:
self.dic[(1, b)] -= 1
self.dic[(1, b)] = max(0,self.dic[(1, b)])
b = x + y
if (-1,b) in self.dic:
self.dic[(-1, b)] -= 1
if self.dic[(-1, b)] == 0:
del self.dic[(-1, b)]
if x in self.dic_x:
self.dic_x[x] -= 1
if self.dic_x[x] == 0:
del self.dic_x[x]
if y in self.dic_y:
self.dic_y[y] -= 1
if self.dic_y[y] == 0:
del self.dic_y[y]
def is_on(self,x,y):
return x in self.dic_x or y in self.dic_y or (1,y-x) in self.dic or (-1,y+x) in self.dic def gridIllumination(self, N, lamps, queries):
"""
:type N: int
:type lamps: List[List[int]]
:type queries: List[List[int]]
:rtype: List[int]
"""
self.dic = {}
self.dic_x = {}
self.dic_y = {}
self.dic_lamp = {}
for (x,y) in lamps:
self.turn_on(x,y)
self.dic_lamp[(x,y)] = 1
res = []
direction = [(-1,0),(1,0),(0,1),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)]
for (x,y) in queries:
if self.is_on(x,y):
res.append(1)
if (x,y) in self.dic_lamp:
self.turn_off(x, y)
for (i,j) in direction:
if (i+x,j+y) in self.dic_lamp:
self.turn_off(i+x,j+y)
else:
res.append(0)
if (x,y) in self.dic_lamp:
self.turn_off(x, y)
for (i, j) in direction:
if (i + x, j + y) in self.dic_lamp:
self.turn_off(i + x, j + y)
return res

【leetcode】1001. Grid Illumination的更多相关文章

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

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

  2. 【LeetCode】代码模板,刷题必会

    目录 二分查找 排序的写法 BFS的写法 DFS的写法 回溯法 树 递归 迭代 前序遍历 中序遍历 后序遍历 构建完全二叉树 并查集 前缀树 图遍历 Dijkstra算法 Floyd-Warshall ...

  3. 【LeetCode】1162. 地图分析 As Far from Land as Possible(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 这个题想考察什么? 剩下的任务就是套模板! 日期 题目 ...

  4. 【LeetCode】Island Perimeter 解题报告

    [LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...

  5. 【LeetCode】36. Valid Sudoku 解题报告(Python)

    [LeetCode]36. Valid Sudoku 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址 ...

  6. 【LeetCode】764. Largest Plus Sign 解题报告(Python)

    [LeetCode]764. Largest Plus Sign 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...

  7. 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java

    [LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...

  8. 【Leetcode】Pascal&#39;s Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...

  9. 53. Maximum Subarray【leetcode】

    53. Maximum Subarray[leetcode] Find the contiguous subarray within an array (containing at least one ...

随机推荐

  1. find命令查找目录

    find <path> -type d -name "dir_name" -type d是查找目录的参数,如果是查找其他的: -type b: Block specia ...

  2. 【Mybatis】Mybatis缓存

    mybatis提供了缓存机制减轻数据库压力,提高数据库性能 mybatis的缓存分为两级:一级缓存.二级缓存 一级缓存是SqlSession级别的缓存,缓存的数据只在SqlSession内有效 二级缓 ...

  3. window安装activemq

    原文: https://www.cnblogs.com/donsenChen/p/8656563.html ActiveMQ5.14.5下载地址 http://activemq.apache.org/ ...

  4. php面试专题---5、流程控制考点

    php面试专题---5.流程控制考点 一.总结 一句话总结: 看代码不要先看函数里面的内容,要用的时候再去看:注意静态,注意变量作用域,php中的内置函数需要去归类总结,就是太容易忘记了 1.写出如下 ...

  5. bzoj 2242: [SDOI2011]计算器 & BSGS算法笔记

    这题的主要难点在于第三问该如何解决 于是就要知道BSGS是怎样的一种方法了 首先BSGS是meet in the middle的一种(戳下面看) http://m.blog.csdn.net/blog ...

  6. JS 時間戳轉日期格式

    1.日期轉換為時間戳,(如果日期格式為時間戳,將其轉為日期類型,否則輸出傳入的數據) // 如果時間格式為時間戳,將其轉為日期 function timestampToDate(timestamp) ...

  7. 建站手册-浏览器信息:Mozilla 项目

    ylbtech-建站手册-浏览器信息:Mozilla 项目 1.返回顶部 1. http://www.w3school.com.cn/browsers/browsers_mozilla.asp 2. ...

  8. selenium2-java 浏览器下进行登录

    完整代码实现如下: package linear; import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import ...

  9. mac 上查看python3的各种安装路径

    1.mac chromedriver的安装目录:/usr/local/bin 2.mac htmltestrunner的存放目录:命令行下 import sys sys.path/Library/Fr ...

  10. CENTER OS7关闭防火墙

    CentOS 7.0默认使用的是firewall作为防火墙,之前版本是使用iptables. 所以在CentOS 7执行下面命令是无法查看防火墙状态的. [root@localhost ~]# ser ...