栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

1001. 网格照明——对角线状态的维护(对 @宫水三叶 思路的难点解读)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1001. 网格照明——对角线状态的维护(对 @宫水三叶 思路的难点解读)

题目传送门:https://leetcode-cn.com/problems/grid-illumination/

该文主要是记录一下大佬@宫水三叶的题解中的比较难理解的点,如果你看了题解有和我一样的疑问,希望我的理解能够帮到你。
题解链接【宫水三叶】哈希表 + 线映射模拟题

题干中有一个要求:

当一盏灯处于打开状态,它将会照亮自身所在单元格以及同一行 、同一列和两条对角线上的所有其他单元格 。

我们看看大佬是如何巧妙地记录灯所照亮的区域的:

由于点亮每一盏灯,可以使得当前 行、列 和 对角线 的位置被照亮,行列可直接使用棋盘坐标的 (x, y)来代指,而对角线则可以使用「截距」来进行代指,即使用 x+y 和 x−y 进行代指。

直接用x和y记录被照亮的行和列挺好理解的,但为什么被照亮的对角线可以使用x+y和x-y来代指呢?

原因在于对于任意点(x, y),
所在的主对角线(左上到右下)上的点(xi, yi)都有 xi - yi = x - y;
所在的副对角线(右上到左下)上的点(xi, yi)都有 xi + yi = x + y;

用代码很好验证这个性质:

System.out.println("x + y:");
for (int x = 0; x < 5; x++) {
    for (int y = 0; y < 5; y++) {
        System.out.print((x + y) + "t");
    }
    System.out.println();
}
System.out.println("x - y:");
for (int x = 0; x < 5; x++) {
    for (int y = 0; y < 5; y++) {
        System.out.print((x - y) + "t");
    }
    System.out.println();
}

结果如下:

可以发现主对角线上x-y的值都是一样的,副对角线上x+y的值都是一样的。
所以两个对角线的状态,可以直接用x-y和x+y来记录,省去了遍历更新对角线上所有点的时间。

另外,用线性映射对坐标进行降维存储(用一维数组存储二维矩阵的思想),也是很简单但是值得学习的一个技巧。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/731739.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号