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

2024-02-10 15:28

本文主要是介绍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;}
};

这篇关于leetcode 3027. 人员站位的方案数 II【离散化前缀和+枚举】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697455

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera