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来记录,省去了遍历更新对角线上所有点的时间。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值