3025. 人员站位的方案数 I

简介: 3025. 人员站位的方案数 I

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

给你一个  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 <= 50
  • points[i].length == 2
  • 0 <= points[i][0], points[i][1] <= 50
  • points[i] 点对两两不同。

解题思路

  • 1、首先我们先对坐标集合进行排序,以左上到右下的顺序排
points = points.sort((a, b) => {
  if (a[0] === b[0]) return b[1] - a[1];
  return a[0] - b[0];
});
  • 2、编写一个检查函数,用于判断坐标集合中是否有某个坐标位于两个点围成的矩形中
const check = (ind1, ind2) => {
  const p1 = points[ind1],
    p2 = points[ind2];
  if ((p1[1] !== p2[1] && p1[0] > p2[0]) || (p1[0] != p2[0] && p1[1] < p2[1]))
    return false;
  for (let i = 0; i < points.length; i++) {
    if (i === ind1 || i === ind2) continue;
    const p = points[i];
    if (p1[0] <= p[0] && p2[0] >= p[0] && p1[1] >= p[1] && p2[1] <= p[1])
      return false;
  }
  return true;
};
  • 3、枚举所有坐标组合进行判断,计算满足要求的坐标组合数
for (let i = 0; i < points.length; i++) {
  for (let j = i + 1; j < points.length; j++) {
    if (check(i, j)) {
      cnt++;
    }
  }
}

1.首先,对 points 数组进行排序。排序规则是先按照元素的第一个值升序排序,如果第一个值相同,则按照第二个值降序排序。

2.初始化计数器 cnt 为 0。

3.定义了一个名为 check 的辅助函数,用于检查两个点是否满足特定条件。详细条件如下:

  • 如果两个点的纵坐标不相等且第一个点的横坐标大于第二个点的横坐标,或者两个点的横坐标不相等且第一个点的纵坐标小于第二个点的纵坐标,则返回 false。
  • 遍历除了这两个点之外的所有点,如果存在一个点落在这两个点所形成的矩形区域内,则返回 false。
  • 如果以上条件都不满足,则返回 true。

4.使用两层循环遍历所有的点对,对每一对点调用 check 函数进行检查,如果满足条件,则将计数器 cnt 加一。

5.返回计数器 cnt 的值。

AC代码

/**
 * @param {number[][]} points
 * @return {number}
 */
var numberOfPairs = function (points) {
  points = points.sort((a, b) => {
    if (a[0] === b[0]) return b[1] - a[1];
    return a[0] - b[0];
  });
  let cnt = 0;
  const check = (ind1, ind2) => {
    const p1 = points[ind1],
      p2 = points[ind2];
    if ((p1[1] !== p2[1] && p1[0] > p2[0]) || (p1[0] != p2[0] && p1[1] < p2[1]))
      return false;
    for (let i = 0; i < points.length; i++) {
      if (i === ind1 || i === ind2) continue;
      const p = points[i];
      if (p1[0] <= p[0] && p2[0] >= p[0] && p1[1] >= p[1] && p2[1] <= p[1])
        return false;
    }
    return true;
  };
  for (let i = 0; i < points.length; i++) {
    for (let j = i + 1; j < points.length; j++) {
      if (check(i, j)) {
        cnt++;
      }
    }
  }
  return cnt;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
3月前
|
存储 算法 大数据
指标类需求问题之在商品开发和运营过程中,减少指标计算以节省人效要怎么操作
指标类需求问题之在商品开发和运营过程中,减少指标计算以节省人效要怎么操作
|
3月前
|
测试技术 持续交付
持续部署的内涵和实施路径问题之发布时间超过8小时会带来的问题如何解决
持续部署的内涵和实施路径问题之发布时间超过8小时会带来的问题如何解决
|
3月前
跨项目度量问题之了解各项目的存量工作量如何解决
跨项目度量问题之了解各项目的存量工作量如何解决
|
4月前
|
供应链 监控 算法
ERP系统中的库存优化与成本控制解析
【7月更文挑战第25天】 ERP系统中的库存优化与成本控制解析
317 2
|
6月前
|
算法 前端开发
选择建筑的方案数
选择建筑的方案数
39 0
|
机器人 vr&ar
案例19-生产事故临时解决和最终解决方案
生产事故临时解决和最终解决方案
181 0
案例19-生产事故临时解决和最终解决方案
|
算法 搜索推荐 Shell
一篇文章带你整体把控算法中的基本问题《排序
排序 本篇文章对算法中的基本问题--排序 的思想进行了描述,后续文章会对所有排序算法进行实现,欢迎关注本系列。 可以转载,但请声明源链接:文章源链接justin3go.com(有些latex公式某些平台不能渲染可查看这个网站)
79 0
|
测试技术 应用服务中间件
软件测试面试题:在给定的测试环境下进行,考虑被测系统的业务压力量和典型场景?
软件测试面试题:在给定的测试环境下进行,考虑被测系统的业务压力量和典型场景?
171 0
支付业务实战对复杂if else 判断的优化
支付业务实战对复杂if else 判断的优化
117 0
|
运维 自然语言处理 网络协议
驿公里洗车机运维与系统更新时间缩短50%
阿里云AIoT联合硬件合作伙伴,输出预置AliOS Things物联网操作系统的集控制,通信,多媒体一体的硬件产品,帮助用户完成从传统PLC控制系统到智能数字化系统的转型。
驿公里洗车机运维与系统更新时间缩短50%