leetcode
leetcode 2851 ~ 2900
最小矩形面积

最小矩形面积

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 117 ms, 内存: 43.0 MB


/*
题目思路:
1. 使用Java Stream计算所有直线的交点。
2. 过滤出不平行的直线组合。
3. 计算最小矩形覆盖面积。
*/
import java.util.*;
import java.util.stream.*;

public class MinAreaRectangleStream {
    public double minRectangleArea(int[][] lines) {
        List<Point> points = IntStream.range(0, lines.length)
            .boxed()
            .flatMap(i -> IntStream.range(i + 1, lines.length)
                .mapToObj(j -> new int[][] {lines[i], lines[j]})
                .filter(pair -> pair[0][0] != pair[1][0]) // 过滤平行直线
                .map(pair -> {
                    double x = (double) (pair[1][1] - pair[0][1]) / (pair[0][0] - pair[1][0]);
                    double y = pair[0][0] * x + pair[0][1];
                    return new Point(x, y);
                }))
            .collect(Collectors.toList());

        if (points.size() <= 1) return 0.0;
        double minX = points.stream().mapToDouble(p -> p.x).min().getAsDouble();
        double maxX = points.stream().mapToDouble(p -> p.x).max().getAsDouble();
        double minY = points.stream().mapToDouble(p -> p.y).min().getAsDouble();
        double maxY = points.stream().mapToDouble(p -> p.y).max().getAsDouble();
        return (maxX - minX) * (maxY - minY);
    }

    class Point {
        double x, y;
        Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
    }
}

解释

方法:

此题解的思路涉及首先对直线进行排序和分类,以斜率k为键,将所有具有相同斜率的直线的截距b存储在一个字典中。接着,对于每一对具有相邻斜率的直线组,计算出这两组直线中截距最小的直线与截距最大的直线间的两个交点坐标。通过这种方式,可以确保覆盖了所有可能的交点。之后,计算所有交点的x坐标和y坐标的最大值和最小值,使用这些值来计算矩形的面积。如果没有交点,即交点集为空,面积返回为0。

时间复杂度:

O(n log n)

空间复杂度:

O(n)

代码细节讲解

🦆
在题解中,为何选择使用字典来存储斜率和截距,而不是其他数据结构如数组或集合?
在处理问题时,使用字典来存储斜率和对应的截距列表的主要原因是便于快速访问和管理具有相同斜率的所有直线。字典提供了根据斜率键快速查找其所有截距的能力,这是数组或集合无法有效提供的。数组或集合顺序存储元素,而不提供根据特定键直接访问元素的功能,这会使得查找和插入操作更加复杂和耗时。而在字典中,斜率作为键,可以直接访问并操作所有对应的截距,这使得数据的组织和后续处理如排序和交点计算更加高效和方便。
🦆
题解中提到,对斜率进行排序后计算相邻斜率的直线组交点,为什么需要排序这一步骤?
对斜率进行排序是为了简化和有效地计算交点。排序后,可以确保处理的直线组是按照斜率的顺序来的,这使得只需考虑相邻斜率组之间的交点。这种方法减少了不必要的比较和计算,因为非相邻的斜率组之间的直线极不可能在覆盖所有交点的最小矩形区域内相交。通过只计算相邻斜率组的交点,可以有效地找到构成最小矩形的所有必要的边界交点,同时保持算法的效率和简洁性。
🦆
解法中只计算了相邻斜率的直线组间的交点,这样做是否能保证覆盖所有交点?
在这个特定的题解中,只计算相邻斜率的直线组间的交点是基于假设所有重要的交点都发生在这些相邻斜率组的直线之间。该方法的有效性依赖于问题的具体情况和斜率的分布。在大多数情况下,这种方法足以找到构建最小矩形所需的所有关键交点。然而,理论上,非相邻斜率的直线组也可能在某些情况下产生关键交点,尤其是在斜率值密集或极端的情况下。因此,虽然这种方法在实际应用中通常是有效的,但它可能不会在所有可能的案例中覆盖绝对所有的交点。

相关问题