【每日一题】检查骑士巡视方案

Tag

【模拟】【数组】【2023-09-13】


题目来源

2596. 检查骑士巡视方案


题目解读

有一个 n * n 大小的整数矩阵 grid,矩阵内整数范围为 [0, n * n - 1]grid[i][j] 表示单元格 (i, j) 是骑士访问的第 grid[i][j] 个单元格。骑士对单元格的访问是从 (0, 0) 开始的。骑士的有效行动有两种,一种是在水平方向移动两个格子并且竖直方向移动一个格子,另一种是水平方向移动两个格子并且竖直方向移动一个格子。请你判断矩阵 grid 是否表示了骑士的有效行动方案,如果是返回 true,否则返回 false


解题思路

方法一:模拟

grid[i][j] 表示单元格 (i, j) 是骑士访问的第 grid[i][j] 个单元格,我们可以先按照访问从前到后的顺序记录一下骑士访问的单元格,然后进行判断:

  • 因为骑士需要从 (0, 0) 位置开始行动,所以如果访问的第一个单元格,不是从 (0, 0) 位置出发的,直接返回 false

  • 接下来任意两次相邻行动到达的单元格一定要满足:

    • 水平方向上相差两个格子,并且竖直方向相差一个格子;
    • 或者竖直方向上相差两个格子,并且水平方向相差一个格子;
  • 以上两个条件可以简化为 d x 2 + d y 2 = 5 dx^2 + dy^2 = 5 dx2+dy2=5,其中 dx 表示两次相邻行动到达的单元格水平方向上的差值,dy 表示竖直方向上的差值;如果 d x 2 + d y 2 ≠ 5 dx^2 + dy^2 \not= 5 dx2+dy2=5,直接返回 fasle

  • 其他情况返回 true

具体实现中,可以使用一个二维数组 pos 记录骑士按顺序到达的位置。

实现代码

class Solution {
public:
    bool checkValidGrid(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<vector<int>> pos(n*n, vector<int>(2));
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                pos[grid[i][j]][0] = i;
                pos[grid[i][j]][1] = j;
            }
        }

        if (pos[0][0] != 0 || pos[0][1] != 0) return false;
        for (int i = 0; i < n*n - 1; ++i) {
            int dx = abs(pos[i+1][0] - pos[i][0]);
            int dy = abs(pos[i+1][1] - pos[i][1]);
            if ((dx*dx + dy*dy) != 5) return false;
        }
        return true;
    }
};

复杂度分析

时间复杂度: O ( n 2 ) O(n^2) O(n2) n n n 为矩阵的长度(宽度)。

空间复杂度: O ( n 2 ) O(n^2) O(n2),使用的额外空间为记录骑士按顺序到达的位置矩阵。


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wang_nn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值