leetcode 3027. 人员站位的方案数 II【离散化前缀和+枚举】

原题链接:3027. 人员站位的方案数 II

题目描述:

给你一个  n x 2 的二维数组 points ,它表示二维平面上的一些点坐标,其中 points[i] = [xi, yi] 。

我们定义 x 轴的正方向为 右 (x 轴递增的方向),x 轴的负方向为 左 (x 轴递减的方向)。类似的,我们定义 y 轴的正方向为 上 (y 轴递增的方向),y 轴的负方向为 下 (y 轴递减的方向)。

你需要安排这 n 个人的站位,这 n 个人中包括 liupengsay 和小羊肖恩 。你需要确保每个点处 恰好 有 一个 人。同时,liupengsay 想跟小羊肖恩单独玩耍,所以 liupengsay 会以 liupengsay 的坐标为 左上角 ,小羊肖恩的坐标为 右下角 建立一个矩形的围栏(注意,围栏可能 不 包含任何区域,也就是说围栏可能是一条线段)。如果围栏的 内部 或者 边缘 上有任何其他人,liupengsay 都会难过。

请你在确保 liupengsay 不会 难过的前提下,返回 liupengsay 和小羊肖恩可以选择的 点对 数目。

注意,liupengsay 建立的围栏必须确保 liupengsay 的位置是矩形的左上角,小羊肖恩的位置是矩形的右下角。比方说,以 (1, 1) ,(1, 3) ,(3, 1) 和 (3, 3) 为矩形的四个角,给定下图的两个输入,liupengsay 都不能建立围栏,原因如下:

  • 图一中,liupengsay 在 (3, 3) 且小羊肖恩在 (1, 1) ,liupengsay 的位置不是左上角且小羊肖恩的位置不是右下角。
  • 图二中,liupengsay 在 (1, 3) 且小羊肖恩在 (1, 1) ,小羊肖恩的位置不是在围栏的右下角。

输入输出描述:

示例 1:

输入:points = [[1,1],[2,2],[3,3]]
输出:0
解释:没有办法可以让 liupengsay 的围栏以 liupengsay 的位置为左上角且小羊肖恩的位置为右下角。所以我们返回 0 。

示例 2:

​编辑

输入:points = [[6,2],[4,4],[2,6]]
输出:2
解释:总共有 2 种方案安排 liupengsay 和小羊肖恩的位置,使得 liupengsay 不会难过:
- liupengsay 站在 (4, 4) ,小羊肖恩站在 (6, 2) 。
- liupengsay 站在 (2, 6) ,小羊肖恩站在 (4, 4) 。
不能安排 liupengsay 站在 (2, 6) 且小羊肖恩站在 (6, 2) ,因为站在 (4, 4) 的人处于围栏内。

示例 3:

​编辑

输入:points = [[3,1],[1,3],[1,1]]
输出:2
解释:总共有 2 种方案安排 liupengsay 和小羊肖恩的位置,使得 liupengsay 不会难过:
- liupengsay 站在 (1, 1) ,小羊肖恩站在 (3, 1) 。
- liupengsay 站在 (1, 3) ,小羊肖恩站在 (1, 1) 。
不能安排 liupengsay 站在 (1, 3) 且小羊肖恩站在 (3, 1) ,因为站在 (1, 1) 的人处于围栏内。
注意围栏是可以不包含任何面积的,上图中第一和第二个围栏都是合法的。

提示:

  • 2 <= n <= 1000
  • points[i].length == 2
  • -10^9 <= points[i][0], points[i][1] <= 10^9
  • points[i] 点对两两不同。

解题思路:

方法1:离散化前缀和

这个题目看一眼就知道是二维前缀和,只不过值域非常大,需要离散化,我们可以将x,y坐标放在一起离散化,也可以分开离散化,分开离散化时间和空间要求都低一些,所以我们分开离散化即可,由于需要使用前缀和,所以离散x的同时肯定还要离散化x-1,离散化y的同时还要离散化y-1。

时间复杂度:O(n^2),但是n最大2000。

空间复杂度:O(n^2),n最大2000。

按道理这个时间复杂度是能过的,但是由于这个双周赛case设计有问题,数据非常弱,导致比赛时很多O(n^3)暴力都水过去了,然后赛后为了卡掉那些暴力,加了一些case,可能还把时间限制放的很低,导致这个写法有时候能过,有时候会超时,相当于这个做法也被卡常了,我已经试过了,交了几发,有时候能过,有时候过不了。

离散化前缀和cpp代码如下:

const int N=2010;
int s[N][N];
class Solution {
public:int numberOfPairs(vector<vector<int>>& points) {unordered_map<int,int>mp1,mp2; //mp1用于离散化x坐标,mp2离散化y坐标vector<int>nums1,nums2;int n=points.size();int cnt1=0,cnt2=0;for(auto& t:points){int x=t[0],y=t[1];nums1.push_back(x);nums1.push_back(x-1);nums2.push_back(y);nums2.push_back(y-1);}//x,y坐标分别离散化sort(nums1.begin(),nums1.end());sort(nums2.begin(),nums2.end());for(int i=0;i<nums1.size();i++){int v1=nums1[i],v2=nums2[i];if(i==0)mp1[v1]=++cnt1,mp2[v2]=++cnt2;else {if(nums1[i]!=nums1[i-1])mp1[nums1[i]]=++cnt1;if(nums2[i]!=nums2[i-1])mp2[nums2[i]]=++cnt2;}}//根据离散化之后x,y坐标数,初始化前缀和int mx1=cnt1,mx2=cnt2;// vector<vector<int>>s(mx1+1,vector<int>(mx2+1));for(int i=1;i<=mx1;i++)for(int j=1;j<=mx2;j++)s[i][j]=0;for(auto&t:points){int x=t[0],y=t[1];s[mp1[x]][mp2[y]]++;}//预处理前缀和for(int i=1;i<=mx1;i++)for(int j=1;j<=mx2;j++)s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];//枚举int ans=0;for(int i=0;i<n;i++){int x1=mp1[points[i][0]],y1=mp2[points[i][1]];for(int j=0;j<n;j++){if(i==j)continue;int x2=mp1[points[j][0]],y2=mp2[points[j][1]];if(x2>=x1 && y2<=y1){if(s[x2][y1]-s[x2][y2-1]-s[x1-1][y1]+s[x1-1][y2-1]==2){ans++;}}}}return ans;}
};

方法二:挖掘性质+枚举

首先题目说了一个在左上角,一个在右下角,从左往右横坐标x递增,从上往下纵坐标递减,所以我们从按照横坐标从小到达排序,横坐标相同时,纵坐标从大到小排序,固定i,从j=i+1枚举,那么j的纵坐标必须小于等于i的纵坐标,同时j的纵坐标必须大于前面枚举的所有点的纵坐标,才能保证i为左上角,j为右下角的矩形里面和边界没有其他点。

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

空间复杂度:O(1),不考虑排序使用的栈空间。

挖掘性质+枚举cpp代码如下:

class Solution {
public:int numberOfPairs(vector<vector<int>>& points) {sort(points.begin(),points.end(),[&](vector<int>&A,vector<int>&B){return A[0]!=B[0]?A[0]<B[0]:A[1]>B[1];});int ans=0,n=points.size();for(int i=0;i<n;i++){int y1=points[i][1];int max_y=-1e9-1;for(int j=i+1;j<n;j++){int y=points[j][1];if(y<=y1 && y>max_y){ans++;max_y=y;}}}return ans;}
};

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

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

相关文章

vue-内置组件-Suspense

Suspense (实验性功能) <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 <Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌…

【前端高频面试题--Vue3.0篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 高频前端面试题--Vue3.0篇 Vue3.0有什么更新defineProperty和proxy的区别Vue3.0 为什么要用 pro…

[word] word2019段落中创建纵横混排的方法图解教程 #知识分享#其他#职场发展

word2019段落中创建纵横混排的方法图解教程 有时候在word文档中需要让文字纵横混排&#xff0c;word2019正好为我们带来了纵横混排的功能了&#xff0c;今天我们就来给大家介绍一下word2019段落中创建纵横混排的方法。 步骤1&#xff1a;打开Word文档&#xff0c;选中需要纵向…

ARM:AI 的翅膀,还能飞多久?

ARM&#xff08;ARM.O&#xff09;于北京时间 2024 年 2 月 8 日上午的美股盘后发布了 2024 年第三财年报告&#xff08;截止 2023 年 12 月&#xff09;&#xff0c;要点如下&#xff1a; 1、整体业绩&#xff1a;收入再创新高。ARM 在 2024 财年第三季度&#xff08;即 23Q4…

Docker-CE 国内源国内镜像

Docker-CE 就是 Docker Community Edition 的意思 docker-ce由docker官方维护 , docker.io由Debian维护 Docker官文 – Install Docker Engine on CentOS Docker官文 – Install Docker Engine on Fedora Docker官文 – Install Docker Engine on Debian Docker官文 – In…

k8s学习-Kubernetes Ingress

1.1 什么是Ingress&#xff1f; 首先我们来思考用传统的web服务器&#xff0c;比如Nginx&#xff0c;如何处理这种场景&#xff1f; 比如使用Nginx充当一个反向代理服务器拦截外部请求&#xff0c;读取路由规则配置&#xff0c;转发相应的请求到后端服务。 kubernetes处理这种…

python-pandas查漏补缺

1. create labels for Series 2. 3. 4. 用平均数等去填empty的格子 5. 6. 7.

巴尔加瓦算法图解【完结】:算法运用(下)

目录 布隆过滤器HyperLogLogSHA算法比较文件检查密码 Diffie-Hellman密钥交换线性规划结语&#xff08;完结&#xff09; 布隆过滤器 在元素很多的情况下&#xff0c;判断一个元素是否在集合中可以使用布隆过滤器。布隆过滤器&#xff08;Bloom Filter&#xff09;是 1970 年由…

旅游|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)

旅游管理系统目录 目录 基于Springboot的旅游管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户管理 2、景点分类管理 3、景点信息管理 4、酒店信息管理 5、景点信息 6、游记分享管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xf…

037 稀疏数组

代码示例 /*** 生成稀疏数组* param arr 原数组* param defaultValue 数组默认值* return*/ static int[][] extractArray(int[][] arr, int defaultValue) {// 统计有多少个非默认值int count 0;for (int i 0; i < arr.length; i) {for (int j 0; j < arr[i].lengt…

【算法训练营】栈,队列,二叉树习题1-1(python实现)

栈 描述 实现一个栈&#xff0c;完成以下功能&#xff1a; 入栈出栈询问栈中位置Y是谁 一开始栈为空。栈中的位置从1开始&#xff08;即栈底位置为1&#xff09;。 输入 第一行一个整数n&#xff0c;表示操作个数。 接下来n行&#xff0c;每行第一个数字表示操作&#xff08;见…

软考网工笔记1:计算机网络的形成和发展

计算机网络的形成和发展 一、早期的计算机网络 1、1951年&#xff0c;美国麻省理工学院林肯实验室就开始为美国空军设计称为 SAGE 的半自动化地面防空系统&#xff0c;该系统最终于1963年建成&#xff0c;被认为是计算机和通信技术结合的先驱。 2、美国航空公司与 IBM公司在…

谷歌发布AI新品Gemini及收费模式;宜家推出基于GPT的AI家装助手

&#x1f989; AI新闻 &#x1f680; 谷歌发布AI新品Gemini及收费模式 摘要&#xff1a;谷歌宣布将原有的AI产品Bard更名为Gemini&#xff0c;开启了谷歌的AI新篇章。同时推出了强化版的聊天机器人Gemini Advanced&#xff0c;支持更复杂的任务处理&#xff0c;提供了两个月的…

C++服务器端开发(10):性能优化

选择合适的数据结构和算法&#xff1a;使用适当的数据结构和算法可以极大地提高服务器的性能。例如&#xff0c;使用哈希表来快速访问和检索数据&#xff0c;使用平衡二叉树来维护有序的数据等。 减少内存分配和释放&#xff1a;频繁的内存分配和释放操作会导致性能下降。可以…

Mysql Day03

多表设计 一对多 在多的一方添加外键约束&#xff0c;关联另外一方主键 一对一 任意一方添加外键约束&#xff0c;关联另外一方主键 多对多 建立第三张中间表&#xff0c;中间表至少包含两个外键&#xff0c;分别关联两方主键 idstu_idcourse_id 1 11 2 12313421524 案…

融资项目——获取树形结构的数据

如下图所示&#xff0c;下列数据是一个树形结构数据&#xff0c;行业中包含若干子节点。表的设计如下图&#xff0c;设置了一个id为1的虚拟根节点。&#xff08;本树形结构带虚拟根节点共三层&#xff09; 实现逻辑&#xff1a; 延时展示方法&#xff0c;先展现第二层的信息&a…

机器学习8-决策树

决策树&#xff08;Decision Tree&#xff09;是一种强大且灵活的机器学习算法&#xff0c;可用于分类和回归问题。它通过从数据中学习一系列规则来建立模型&#xff0c;这些规则对输入数据进行递归的分割&#xff0c;直到达到某个终止条件。 决策树的构建过程&#xff1a; 1.…

2024年生成式AI芯片市场规模将达500亿美元

1月24日&#xff0c;德勤发布《2024科技、传媒和电信行业预测》中文版报告&#xff0c;2024年是科技、传媒和电信行业关键的一年&#xff0c;不少科技公司正利用生成式AI升级软件和服务&#xff0c;预计今年全球生成式人工智能芯片销售额可能达到500亿美元以上。 2024年将有许…

【开源】基于JAVA+Vue+SpringBoot的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

Mysql一行记录存储过程

Mysql一行记录存储过程 Mysql的文件架构 行&#xff08;row&#xff09; 数据库表中的记录都是行存放的&#xff0c;每行继续根据不同的行格式都有不同的存储结构。 页&#xff08;page&#xff09; 记录是按照行来存储的&#xff0c;但是数据库的读取是以页为单位的&…