排序题目:两点之间不包含任何点的最宽垂直面积

题目

标题和出处

标题:两点之间不包含任何点的最宽垂直面积

出处:1637. 两点之间不包含任何点的最宽垂直面积

难度

3 级

题目描述

要求

给定二维平面上的 n \texttt{n} n 个点 points \texttt{points} points,其中 points[i]   =   [x i ,   y i ] \texttt{points[i] = [x}_\texttt{i}\texttt{, y}_\texttt{i}\texttt{]} points[i] = [xi, yi],返回两点之间内部不包含任何点的最宽垂直区域的宽度。

垂直区域的定义是固定宽度, y \texttt{y} y 轴方向上无限延伸的一块区域(高度为无穷大)。最宽垂直区域为宽度最大的一个垂直区域。

请注意,垂直区域边上的点不在区域内。

示例

示例 1:

示例 1

输入: points   =   [[8,7],[9,9],[7,4],[9,7]] \texttt{points = [[8,7],[9,9],[7,4],[9,7]]} points = [[8,7],[9,9],[7,4],[9,7]]
输出: 1 \texttt{1} 1
解释:红色区域和蓝色区域都是最优区域。

示例 2:

输入: points   =   [[3,1],[9,0],[1,0],[1,4],[5,3],[8,8]] \texttt{points = [[3,1],[9,0],[1,0],[1,4],[5,3],[8,8]]} points = [[3,1],[9,0],[1,0],[1,4],[5,3],[8,8]]
输出: 3 \texttt{3} 3

数据范围

  • n = points.length \texttt{n} = \texttt{points.length} n=points.length
  • 2 ≤ n ≤ 10 5 \texttt{2} \le \texttt{n} \le \texttt{10}^\texttt{5} 2n105
  • points[i].length = 2 \texttt{points[i].length} = \texttt{2} points[i].length=2
  • 0 ≤ x i ,   y i ≤ 10 9 \texttt{0} \le \texttt{x}_\texttt{i}\texttt{, y}_\texttt{i} \le \texttt{10}^\texttt{9} 0xi, yi109

解法

思路和算法

由于垂直区域的宽度只和每个点的横坐标有关,因此只需要知道每个点的横坐标即可计算最宽垂直区域的宽度。

假设有两个点的横坐标分别是 x 1 x_1 x1 x 2 x_2 x2,其中 x 1 ≤ x 2 x_1 \le x_2 x1x2,如果 x 1 x_1 x1 x 2 x_2 x2 之间的区域是不包含任何点的垂直区域,则其他任何点的横坐标 x x x 都满足 x ≤ x 1 x \le x_1 xx1 x ≥ x 2 x \ge x_2 xx2,即 x 1 < x < x 2 x_1 < x < x_2 x1<x<x2 的情况是不符合垂直区域的要求的。因此,需要将所有点的横坐标升序排序,排序后的横坐标中的相邻两个横坐标之间的区域是不包含任何点的垂直区域。

将所有点的横坐标升序排序之后,遍历排序后的横坐标,对于每一对相邻的横坐标计算横坐标之差,即为这对相邻的横坐标之间的垂直区域的宽度。遍历结束之后,即可得到最宽垂直区域的宽度。

代码

class Solution {
    public int maxWidthOfVerticalArea(int[][] points) {
        int n = points.length;
        int[] xVals = new int[n];
        for (int i = 0; i < n; i++) {
            xVals[i] = points[i][0];
        }
        Arrays.sort(xVals);
        int maxWidth = 0;
        for (int i = 1; i < n; i++) {
            int width = xVals[i] - xVals[i - 1];
            maxWidth = Math.max(maxWidth, width);
        }
        return maxWidth;
    }
}

复杂度分析

  • 时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn),其中 n n n 是数组 points \textit{points} points 的长度。需要 O ( n ) O(n) O(n) 的时间将每个点的横坐标填入新数组,对新数组排序需要 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的时间,遍历排序后的新数组计算最宽垂直区域的宽度需要 O ( n ) O(n) O(n) 的时间,时间复杂度是 O ( n log ⁡ n ) O(n \log n) O(nlogn)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 points \textit{points} points 的长度。新数组需要 O ( n ) O(n) O(n) 的空间,对新数组排序需要 O ( log ⁡ n ) O(\log n) O(logn) 的递归调用栈空间,空间复杂度是 O ( n ) O(n) O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟大的车尔尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值