统计梯形的数目I-LeetCode
3623.统计梯形的数目I
🎯 问题描述
描述:
给定平面上的 个点 points,其中 points[i] = [x_i, y_i]。
请你统计这些点能组成多少个梯形。
梯形的定义是:至少有一组对边平行,且另一组对边不平行(或者简单定义为有一组对边平行)。
在本题的特定语境下(基于代码逻辑推断),通常指上下底平行于 x 轴的梯形。
即:我们需要选择两条不同的水平线(y 坐标不同),每条线上至少选两个点,从而构成一个梯形。
说明:
-
这是一个组合数学结合哈希表计数的问题。
-
核心逻辑是:梯形由两条平行的底边组成。
-
如果一条水平线上有 个点,那么这条线上可以形成 条线段。
-
任意两条不同高度的线段都可以组成一个梯形。
-
利用前缀和思想优化计算过程。
-
示例:
-
示例 1:
1 | 输入:points = [[0,0],[1,0],[0,1],[1,1],[2,1]] |
💻 解题思路
思路1:组合数学 + 前缀和优化
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
- 时间复杂度:
- 其中 是
points的长度。 Counter统计需要遍历一次数组,耗时 。- 遍历
count.values(),由于 y 坐标的种类最多为 ,所以也是 。 - 总时间复杂度为 。
- 其中 是
- 空间复杂度:
Counter哈希表在最坏情况下存储 个不同的 y 坐标。
思考
-
几何转化:
- 梯形需要两条平行的边。在坐标系中,最简单的平行边是水平线段(y 坐标相同)。
- 要形成一个梯形,我们需要:
- 在高度 上选两个点,形成线段 。
- 在高度 上选两个点,形成线段 ()。
- 这两条线段 和 天然平行,且位于不同高度,因此一定能构成一个梯形。
-
组合计算:
- 如果某一行有 个点,从中选 2 个点的方案数是组合数 。这就是代码中的
e_count。
- 如果某一行有 个点,从中选 2 个点的方案数是组合数 。这就是代码中的
-
前缀和优化(核心逻辑):
- 我们需要计算所有不同高度线段对的乘积之和。
- 假设高度 的线段数分别为 。
- 总梯形数 = 。
- 暴力计算需要双重循环 。
- 优化方法:
- 维护一个变量
s,表示当前遍历到的位置之前,所有线段数的总和(即 )。 - 当遍历到第 个高度时,新增的梯形数就是 。
- 然后更新
s += c_i。
- 维护一个变量
- 这样可以将复杂度降低到 。
-
取模运算:
- 由于结果可能很大,需要在返回时取模 。
-
边界情况:
- 点数少于 4 个:无法构成梯形,返回 0。
- 所有点都在同一条直线上:只能形成线段,无法形成两条不同高度的边,返回 0。
- 某一行只有 1 个点:无法形成线段,
e_count为 0,不影响结果。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






