1. 解题思路
这一题思路上就是一个分块加累积数组即可。
我们首先统计一下每一个y值上有多少个点,那么在对应的位置上即可有 C n 2 C_n^2 Cn2种边的选取方式。然后,我们从小到大依次考察每一条边作为上边的情况,此时其能够取到的梯形的个数就恰好是对应位置上所有的边的选取方式乘上其下方所有边的可选方式。我们使用一个累积数组即可简化计算了。
2. 代码实现
给出python代码实现如下:
MOD = 10**9+7
class Solution:
def countTrapezoids(self, points: List[List[int]]) -> int:
groups = defaultdict(int)
for x, y in points:
groups[y] += 1
ys = sorted(groups.keys())
cnt = [(groups[y]*(groups[y]-1)//2) % MOD for y in ys]
n = len(cnt)
ans, s = 0, 0
for i in range(n):
ans = (ans + cnt[i] * s) % MOD
s += cnt[i]
return ans
提交代码评测得到:耗时128ms,占用内存63.46MB。