题目
标题和出处
标题:两点之间不包含任何点的最宽垂直面积
难度
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:
输入:
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} 2≤n≤105
- 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} 0≤xi, yi≤109
解法
思路和算法
由于垂直区域的宽度只和每个点的横坐标有关,因此只需要知道每个点的横坐标即可计算最宽垂直区域的宽度。
假设有两个点的横坐标分别是 x 1 x_1 x1 和 x 2 x_2 x2,其中 x 1 ≤ x 2 x_1 \le x_2 x1≤x2,如果 x 1 x_1 x1 和 x 2 x_2 x2 之间的区域是不包含任何点的垂直区域,则其他任何点的横坐标 x x x 都满足 x ≤ x 1 x \le x_1 x≤x1 或 x ≥ x 2 x \ge x_2 x≥x2,即 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)。