【教3妹学编程-算法题】人员站位的方案数 I

瑟瑟发抖

2哥 : 3妹,今天第一天上班啊,开工大吉~
3妹:2哥,开工大吉鸭,有没有开工红包?
2哥 : 我们公司比较扣,估计不会发的。
3妹:我们公司估计也一样,不过依然挡不住我打工人的热情!
2哥 :哈哈哈哈,公司不给咱发红包,咱们自掏腰包吃顿好的吧,祝愿2024都发大财!
3妹:好鸭好鸭,我想吃火锅,红红火火
2哥:没问题
3妹:听说有的公司,人员站成两排欢迎老板,老板们给发红包
2哥:好吧,只要有红包,站着舔老板也不是不可以🐷,说到人员站位,今天有一道“人员站位”的题目, 让我们先做一下吧~

吃瓜

题目:

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

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

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

请你在确保 Alice 不会 难过的前提下,返回 Alice 和 Bob 可以选择的 点对 数目。

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

图一中,Alice 在 (3, 3) 且 Bob 在 (1, 1) ,Alice 的位置不是左上角且 Bob 的位置不是右下角。
图二中,Alice 在 (1, 3) 且 Bob 在 (1, 1) ,Bob 的位置不是在围栏的右下角。
image.png

示例 1:
image.png
输入:points = [[1,1],[2,2],[3,3]]
输出:0
解释:没有办法可以让 Alice 的围栏以 Alice 的位置为左上角且 Bob 的位置为右下角。所以我们返回 0 。
示例 2:
image.png
输入:points = [[6,2],[4,4],[2,6]]
输出:2
解释:总共有 2 种方案安排 Alice 和 Bob 的位置,使得 Alice 不会难过:

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

提示:

2 <= n <= 50
points[i].length == 2
0 <= points[i][0], points[i][1] <= 50
points[i] 点对两两不同。

思路:

思考

将 points 按照横坐标从小到大排序,横坐标相同的,按照纵坐标从大到小排序。

如此一来,在枚举 points[i] 和 points[j]时(i<j),就只需要关心纵坐标的大小。

固定 points[i],然后枚举 points[j]:

如果 points[j][1] 比之前枚举的点的纵坐标都大,那么矩形内没有其它点,符合要求,答案加一。
如果 points[j][1]小于等于之前枚举的某个点的纵坐标,那么矩形内有其它点,不符合要求。
所以在枚举 points[j]的同时,需要维护纵坐标的最大值 maxY。这也解释了为什么横坐标相同的,按照纵坐标从大到小排序。这保证了横坐标相同时,我们总是优先枚举更靠上的点,不会误把包含其它点的矩形也当作符合要求的矩形。

java代码:

class Solution {
    public int numberOfPairs(int[][] points) {
        Arrays.sort(points, (p, q) -> p[0] != q[0] ? p[0] - q[0] : q[1] - p[1]);
        int ans = 0;
        for (int i = 0; i < points.length; i++) {
            int y0 = points[i][1];
            int maxY = Integer.MIN_VALUE;
            for (int j = i + 1; j < points.length; j++) {
                int y = points[j][1];
                if (y <= y0 && y > maxY) {
                    maxY = y;
                    ans++;
                }
            }
        }
        return ans;
    }
}

  • 37
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值