两点之间不包含任何点的最宽垂直区域
难度:
标签:
题目描述
给你 n
个二维平面上的点 points
,其中 points[i] = [xi, yi]
,请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。
垂直区域 的定义是固定宽度,而 y 轴上无限延伸的一块区域(也就是高度为无穷大)。 最宽垂直区域 为宽度最大的一个垂直区域。
请注意,垂直区域 边上 的点 不在 区域内。
示例 1:

输入:points = [[8,7],[9,9],[7,4],[9,7]] 输出:1 解释:红色区域和蓝色区域都是最优区域。
示例 2:
输入:points = [[3,1],[9,0],[1,0],[1,4],[5,3],[8,8]] 输出:3
提示:
n == points.length
2 <= n <= 105
points[i].length == 2
0 <= xi, yi <= 109
代码结果
运行时间: 92 ms, 内存: 47.5 MB
import java.util.Arrays;
/**
* 思路:
* 1. 提取所有点的x坐标。
* 2. 将x坐标排序。
* 3. 计算相邻x坐标之间的差值,找出最大的差值。
* 4. 返回最大的差值即为最宽垂直区域的宽度。
*/
public class WidestVerticalAreaStream {
public int maxWidthOfVerticalArea(int[][] points) {
// 提取所有点的x坐标,并排序
int[] xCoordinates = Arrays.stream(points)
.mapToInt(point -> point[0])
.sorted()
.toArray();
// 计算相邻x坐标之间的差值,并找出最大的差值
return Arrays.stream(xCoordinates, 1, xCoordinates.length)
.map(i -> xCoordinates[i] - xCoordinates[i - 1])
.max()
.orElse(0);
}
public static void main(String[] args) {
WidestVerticalAreaStream solution = new WidestVerticalAreaStream();
int[][] points1 = {{8, 7}, {9, 9}, {7, 4}, {9, 7}};
int[][] points2 = {{3, 1}, {9, 0}, {1, 0}, {1, 4}, {5, 3}, {8, 8}};
System.out.println(solution.maxWidthOfVerticalArea(points1)); // 输出:1
System.out.println(solution.maxWidthOfVerticalArea(points2)); // 输出:3
}
}
解释
方法:
题解的核心思路是首先提取出所有点的x坐标,然后对这些x坐标进行排序。排序后,相邻两点的x坐标差值就代表了这两点之间的垂直区域的宽度。题目要求的是最宽的垂直区域,因此只需要计算所有相邻x坐标的差值,并找出其中的最大值即可。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
在进行x坐标排序时是否考虑了有可能存在重复的x坐标?重复的x坐标对计算最宽垂直区域的宽度有何影响?
▷🦆
题解中提到的排序算法是Timsort,这种排序方式在处理整型数组时的性能如何?是否存在更优的排序算法适用于这种特定情况?
▷🦆
题解中计算相邻x坐标差值的步骤是否能够处理列表中只有一个点坐标的情况?如果points数组只包含一个点,该如何处理?
▷🦆
在得出最大垂直区域宽度后,题解是否能提供一种方法来实际标识出这个最宽的区域在哪两个点之间?
▷