1222. 可以攻击国王的皇后

news2025/5/26 10:51:30

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:从白国王出发
    • 方法二:从黑皇后出发
  • 写在最后

Tag

【模拟】【数组】


题目来源

1222. 可以攻击国王的皇后


题目解读

在一个 8 × 8 8 \times 8 8×8 的棋盘上,有若干个「黑皇后」和一个「白国王」。现在有一个整数矩阵 queens,表示黑皇后的位置;白国王的坐标为 king。若白国王和某一个黑皇后在同一行、同一列或者在同一条对角线上,并且中间没有其他的黑皇后,则白国王可以攻击该黑皇后。返回可以被白国王攻击的黑皇后的位置。


解题思路

本题解题方法有两种,一种是从白国王出发攻击,另一种是从黑皇后出发。这两种方法都要判断出里白国王最近的 “一圈” 黑皇后。

方法一:从白国王出发

首先将 queens 中黑皇后的位置记录下来,然后枚举白国王可以走的八个方向,在每一个方向上遇到的第一个 queens 中的黑皇后,则该方向上可以攻击的黑皇后攻击完毕,换另一个方向查找可以攻击的黑皇后。

在具体实现中,使用一个集合 pos 将所有的黑皇后记录下来,对于网格中的位置 (x, y),我们可以使用 x * 8 + y 来唯一表示,集合 pos 记录的就是黑皇后的唯一表示位置。

实现代码

class Solution {
public:
    vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
        auto sgn = [](int x) -> int {
            return x > 0 ? 1 : (x == 0 ? 0 : -1);
        };

        unordered_map<int, pair<vector<int>, int>> candidates;
        int kx = king[0], ky = king[1];
        for (auto queen : queens) {
            int qx = queen[0], qy = queen[1];
            int dx = qx - kx, dy = qy - ky;
            if (dx == 0 ||dy == 0 || abs(dx) == abs(dy)) {
                int key = sgn(dx) * 10 + sgn(dy);
                if (!candidates.count(key) || candidates[key].second > abs(dx) + abs(dy)) {
                    candidates[key] ={queen, abs(dx) + abs(dy)} ;
                }
            }
        }

        vector<vector<int>> res;
        for (auto [_, candidate] : candidates) {
            res.push_back(candidate.first);
        }
        return res;
    }
};

复杂度分析

时间复杂度: O ( n + C ) O(n + C) O(n+C) n n n 为数组 queens 的长度,记录黑皇后位置的时间复杂度为 O ( n ) O(n) O(n) C = 8 C = 8 C=8 为,枚举八个方向上的黑皇后的时间复杂度为 O ( C ) O(C) O(C),总的时间复杂度为 O ( n + c ) O(n + c) O(n+c)

空间复杂度: n n n,使用的额外空间是集合占用的空间。

方法二:从黑皇后出发

从每个黑皇后出发,判断是否在白国王的八个方向上。我们枚举每个黑皇后的位置,与白国王的位置求 x 方向和 y 方向上的坐标差 dxdy

  • 如果 dx = 0,则黑皇后与白国王在同一列;
  • 如果 dy = 0,则黑皇后与白国王在同一行;
  • 如果 abs(x) = abs(y),则黑皇后与白国王在对角线上。

经过以上的判断,可以确定在白国王八个方向上的黑皇后,那如何判断是否离白国王最近呢?

我们通过与白国王之间的距离来判断,具体的用 abs(dx) + abs(dy) 来表示当前的黑皇后与白国王的距离。我们使用哈希表 candidates 来记录距离,键为方向的唯一表示,我们首先利用符号函数 s g n ( ) sgn() sgn() 来表示 黑皇后相对于白国王的方向。

s g n ( t ) = { 1 ,    t > 0 0 ,    t = 0 − 1 ,   t < 0 sgn \left( t \right) =\left\{ \begin{array}{l} 1,\ \ t>0\\ 0,\ \ t=0\\ -1,\ t<0\\ \end{array} \right. sgn(t)= 1,  t>00,  t=01, t<0

于是,键可以表示为 10 * sgn(x) + sgn(y)。哈希表的值为 pair<vector<int>, int>,其中第一个数据为黑皇后的位置,第二个变量为当前的黑皇后与白国王的距离即 abs(dx) + dy。于是,我们对 candidates 进行更新,设当前枚举的黑皇后的键为 key

  • 如果 !candidates.count(key),则 candidates 中没有当前的键,直接加入;
  • 如果 candidates[key].second > abs(x) + abs(y),则找到离白国王最近的黑皇后,更新当前的值。

最后,我们遍历 candidates,记录离白国王最近的 “一圈” 黑皇后。

实现代码

class Solution {
public:
    vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
        auto sgn = [](int x) -> int {
            return x > 0 ? 1 : (x == 0 ? 0 : -1);
        };

        unordered_map<int, pair<vector<int>, int>> candidates;
        int kx = king[0], ky = king[1];
        for (auto queen : queens) {
            int qx = queen[0], qy = queen[1];
            int dx = qx - kx, dy = qy - ky;
            if (dx == 0 ||dy == 0 || abs(dx) == abs(dy)) {
                int key = sgn(dx) * 10 + sgn(dy);
                if (!candidates.count(key) || candidates[key].second > abs(dx) + abs(dy)) {
                    candidates[key] ={queen, abs(dx) + abs(dy)} ;
                }
            }
        }

        vector<vector<int>> res;
        for (auto [_, candidate] : candidates) {
            res.push_back(candidate.first);
        }
        return res;
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 queens 的长度。

空间复杂度: O ( C ) O(C) O(C) C = 8 C = 8 C=8,也算是常数时间。


写在最后

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1010411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C语言]栈与队列——喵喵队,冲冲冲

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…

LeetCode刷题笔记【33】:动态规划专题-5(最后一块石头的重量 II、目标和、一和零)

文章目录 前置知识1049. 最后一块石头的重量 II题目描述解题思路代码 494. 目标和题目描述用回溯算法转换为背包问题动态规划 474.一和零题目描述解题思路代码 总结 前置知识 今天是动态规划专题的第5篇, 也是背包问题的第2篇. 所以本文和动态规划专题的1~3弱相关, 和上一篇, …

趣解设计模式之《小店儿菜单的故事》

〇、小故事 在一座小镇上&#xff0c;有两家特别有名气的小店&#xff0c;一家是远近闻名的早餐店&#xff0c;它家的早餐特别好吃&#xff0c;每天早上都能排起长长的队伍&#xff1b;另一家是个蛋糕店&#xff0c;他家是专门从法国请来的蛋糕师傅&#xff0c;蛋糕的香味真是…

uniapp微信小程序《隐私保护协议》弹窗处理流程

背景 《关于小程序隐私保护指引设置的公告》 《小程序隐私协议开发指南》 流程 1.第一步 必须设置且审核通过&#xff01;&#xff01;&#xff01; 2.第二步 uniapp在manifest.json中添加&#xff01;&#xff01;&#xff01; /* 在 2023年9月15号之前&#xff0c;在 ap…

汽车电子智能仓储系统的发展趋势与应用探索

现代汽车制造业中的仓储管理一直面临着多种挑战。仓库中物料的数量种类繁多&#xff0c;寻找物料耗时长、困难大。盘点过程耗费人力多、成本高、速度慢。管理无法达到先进先出的原则&#xff0c;也无法进行精准追溯。此外&#xff0c;多发、少发、错料等问题时有发生。仓库中的…

docker学习:dockerfile和docker-compose

学习如何使用dockerfile 以下内容&#xff0c;部分来自gpt生成&#xff0c;里面的描述可能会出现问题&#xff0c;但代码部分&#xff0c;我都会进行测试。 1. 需求 对于一个docker&#xff0c;例如python&#xff0c;我们需要其在构建成容器时&#xff0c;就有np。有以下两种方…

Linux内核源码分析 (B.x)Linux物理内存的初始化

Linux内核源码分析 (B.x)Linux物理内存的初始化 文章目录 Linux内核源码分析 (B.x)Linux物理内存的初始化一、DDR简介二、内存节点三、内存管理区域ZONE四、 struct zone五、 struct page六、mem_map数组七、伙伴系统简介八、迁移类型九、内存初始化十、总结 一、DDR简介 详细可…

电脑msvcp140.dll丢失问题的三种解决方法分享,快速修复dll问题

在我们的日常生活中&#xff0c;计算机已经成为了我们工作、学习和娱乐的重要工具。然而&#xff0c;在使用计算机的过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是 msvcp140.dll 丢失的困扰。本文将详细介绍 msvcp140.dll 丢失的原因、解决方法以及预防措…

可变参数JAVA

public class Main {public static void main(String[] args) {//方法形参的个数是可以变化的//格式&#xff1a;属性类型...名字System.out.println(getSum(1,2,3,4,5,6,7,8));}//通过键值对对象来遍历&#xff1b;public static int getSum(int a,int...args){//可变参数;int…

AirTag是什么?高精度测距定位防丢,UWB厘米级方案应用

随着科技的不断发展&#xff0c;超宽带&#xff08;UWB&#xff09;技术作为一种新兴的无线通信技术&#xff0c;逐渐受到人们的关注和追捧。 UWB技术以其传输速率高、抗干扰性强、带宽极宽、功耗低、安全性高、穿透力强、定位精准等优势&#xff0c;在众多领域具有广泛的应用…

输电线路故障数据集(基于simulink仿真批量生成故障数据,单相接地故障、两相接地故障、两相间短路故障、三相接地故障、三相间短路故障和正常)

分别获取单相接地故障、两相接地故障、两相间短路故障、三相接地故障、三相间短路故障和正常状态下的电流&#xff08;Ia,Ib,Ic&#xff09;大小和电压&#xff08;Ua,Ub和Uc&#xff09;大小。每种故障下获取1300行左右的数据 将故障区分为具体的不同类型&#xff08;一共五种…

JetBrains设置inline hint的背景色、前景色

如题。修改IDE的hint前景色和背景色。 修改后结果&#xff1a;

为什么DasViewer打开之后一直白屏?如图

答&#xff1a;这种情况可以检查一下电脑的集显驱动。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。#DasViewer##实景三维##三…

跟踪源码技巧+阅读源码工具Sourcetrail

基于Eclipse IDE 1、Quick Type Hierarchy 快速查看类继承体系 &#xff08; 快捷键&#xff1a;Ctrl T&#xff09; 查看类很多人可能都知道&#xff0c;可源码阅读的时候更多用来查看方法体系更重要&#xff0c;可以方便快速的定位到方法的实现类。如&#xff1a; 此时如…

Mendelay-文献管理软件使用教程

Mendelay-文献管理软件 注册账号 注册账号 打开官网&#xff0c;注册个人账号 通过邮箱就可以注册账号啦&#xff0c;这是登录后的页面&#xff0c;并下载Mendeley客户端。 安装好客户端&#xff0c;打开软件首先登录以上注册的账号&#xff0c;则可进入客户端首页。

《安富莱嵌入式周报》第322期:自制10KV电子负载,史上最详细的电池系列资料,创意洞洞板任意互联,开源USB分析仪,英特尔雷电5, QNX功能安全免费课程

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1M8411q7dw/ 《安富莱嵌入式周报》第322期&#xff1a;自制10K…

nvue文件中@click.stop失效

在nvue文件中在子元素使用click.stop失效&#xff0c;父元素的事件触发了 在uniapp开发中nvue文件是跟vue文件是不一样的&#xff0c;就比如click.stop阻止点击事件继续传播就失效了&#xff0c;这时我们需要在子元素事件中添加条件编译&#xff0c;这样就会解决这个问题 // …

图论第三天|130. 被围绕的区域、417. 太平洋大西洋水流问题、827. 最大人工岛

130. 被围绕的区域 文档讲解 &#xff1a;代码随想录 - 130. 被围绕的区域 状态&#xff1a;开始学习。 思路&#xff1a; 步骤一&#xff1a; 深搜或者广搜将地图周边的 ‘O’ 全部改成 ’A’&#xff0c;如图所示&#xff1a; 步骤二&#xff1a; 再遍历地图&#xff0c;将 …

记录一次使用网云穿实现内网穿透操作

记录一次使用网云穿实现内网穿透操作 摘要 这段时间也很少写博客了,一方面工作表较忙,一方面觉得有些东西在百度上都能找到,甚至比我自己记录的详细,有些笔记也就没打, 这次记录笔记主要是觉得这个 网云穿 很好用,分享给大家. 1 什么是内网穿透? 内网穿透也叫内网映射&#xf…

zookeeper最基础教程

文章目录 一、简介1、工作机制2、特点3、数据结构4、应用场景5、选举机制 二、软件安装1、单机版安装2、集群安装3、配置参数解读(zoo.cfg)4、ZK集群启动脚本 三、命令行操作1、语法2、使用3、节点相关4、监听器原理5、节点删除与查看 三、写数据流程 一、简介 1、工作机制 官…