【每日一题Day325】LC2596检查骑士巡视方案 | 小顶堆/排序+模拟

简介: 【每日一题Day325】LC2596检查骑士巡视方案 | 小顶堆/排序+模拟

检查骑士巡视方案【LC2596】

骑士在一张 n x n 的棋盘上巡视。在有效的巡视方案中,骑士会从棋盘的 左上角 出发,并且访问棋盘上的每个格子 恰好一次 。

给你一个 n x n 的整数矩阵 grid ,由范围 [0, n * n - 1] 内的不同整数组成,其中 grid[row][col] 表示单元格 (row, col) 是骑士访问的第 grid[row][col] 个单元格。骑士的行动是从下标 0 开始的。

如果 grid 表示了骑士的有效巡视方案,返回 true;否则返回 false。

注意,骑士行动时可以垂直移动两个格子且水平移动一个格子,或水平移动两个格子且垂直移动一个格子。下图展示了骑士从某个格子出发可能的八种行动路线。

image.png

思路:

将每个单元格位置和值组成的三元组放入小顶堆中,保证按顺序移动。

首先需要判断起点是否位于左上角,否则直接返回false【因为这个WA了】

然后判断能否移动至下一个位置,根据横纵坐标的差值判断,差值的可能性有八种,如果符合任意一种则移动至下一个位置,否则返回false

如果可以移动至最后一个节点,那么返回true

实现

class Solution {
    public boolean checkValidGrid(int[][] grid) {
        int n = grid.length;
        // 存储三元组
        PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[2] - o2[2]);
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n; j++){
                pq.add(new int[]{i, j, grid[i][j]});
            }
        }
        // 判断起点
        int[] pre = pq.poll();
        if (pre[0] != 0 || pre[1] != 0) return false;
        while (!pq.isEmpty()){
            int[] next = pq.poll();
            int[] move = {next[0] - pre[0], next[1] - pre[1]};
            // 判断能否移动至下一个位置
            if (!isCorrect(move)){
                return false;
            }
            pre = next;
        }
        return true;
    }
    public boolean isCorrect(int[] move){
        int[] d1 = {2, -2};
        int[] d2 = {1, -1};
        for (int i = 0; i < 2; i++){
            for (int j = 0; j < 2;j++){
                if (move[0] == d1[i] && move[1] == d2[j]){
                    return true;
                }
                if (move[0] == d2[i] && move[1] == d1[j]){
                    return true;
                }
            }
        }
        return false;
    }
}

复杂度

时间复杂度:O(n^2)

空间复杂度:O(n^2)

目录
相关文章
|
开发框架 .NET C#
利用WinDbg分析C#程序产生的转储文件
利用WinDbg分析C#程序产生的转储文件
|
Linux 开发者 iOS开发
QT:基于QMediaPlayer制作的视频播放器(最下方有整合包,可直接运行)
QMediaPlayer是Qt多媒体模块中的一个核心类,它提供了播放音频和视频内容的功能。这个类的设计旨在简化跨平台的媒体播放,使得开发者能够在多种操作系统(如Linux、Windows、macOS及移动平台)上轻松集成多媒体播放能力到他们的应用中,而无需关心底层实现细节。以下是关于QMediaPlayer的一些关键点:
1642 1
|
开发工具 Python 容器
python如何引用变量的名称
总的来说,动态获取变量名在Python中是可能的,但应该小心使用,并考虑代码设计是否存在更优的方法。这些技巧可能在调试和开发工具时有其价值,但可能不适合生产代码。通常,如果你在正常编程中需要这样做,可能是时候重新考虑你的设计了。
145 0
|
数据采集 人工智能 监控
客户管理和运营太难了?瓴羊×阿里云上的Salesforce给出更符合中国企业体质的解法
客户管理和运营太难了?瓴羊×阿里云上的Salesforce给出更符合中国企业体质的解法
217 0
|
并行计算 物联网 测试技术
Llama-2 推理和微调的硬件要求总结:RTX 3080 就可以微调最小模型
大语言模型微调是指对已经预训练的大型语言模型(例如Llama-2,Falcon等)进行额外的训练,以使其适应特定任务或领域的需求。微调通常需要大量的计算资源,但是通过量化和Lora等方法,我们也可以在消费级的GPU上来微调测试,但是消费级GPU也无法承载比较大的模型,经过我的测试,7B的模型可以在3080(8G)上跑起来,这对于我们进行简单的研究是非常有帮助的,但是如果需要更深入的研究,还是需要专业的硬件。
1774 0
|
JSON 测试技术 数据格式
JSON字符串直接转换为目标对象,并测试是否是深度转换
JSON字符串直接转换为目标对象,并测试是否是深度转换
368 0
|
移动开发 资源调度 小程序
「Taro开发」前端多端开发,Taro观赏指南
最近接到多端开发,因为老项目使用的React,考虑到迁移成本,选择了Taro,迁移成本相对较低,且上手较快。
1001 1
MyBatis-Plus 注解方式(一对多、多对一)
MyBatis-Plus 注解方式(一对多、多对一)