leetcode 3623. 统计梯形的数目 I 中等

给你一个二维整数数组 points,其中 points[i] = [xi, yi] 表示第 i 个点在笛卡尔平面上的坐标。

水平梯形 是一种凸四边形,具有 至少一对水平边(即平行于 x 轴的边)。两条直线平行当且仅当它们的斜率相同。

返回可以从 points 中任意选择四个不同点组成的 水平梯形数量。

由于答案可能非常大,请返回结果对 10^9 + 7 取余数后的值。

示例 1:

输入: points = [[1,0],[2,0],[3,0],[2,2],[3,2]]

输出 : 3

解释:

有三种不同方式选择四个点组成一个水平梯形:

  • 使用点 [1,0][2,0][3,2][2,2]
  • 使用点 [2,0][3,0][3,2][2,2]
  • 使用点 [1,0][3,0][3,2][2,2]

示例 2:

输入: points = [[0,0],[1,0],[0,1],[2,1]]

输出: 1

解释:

只有一种方式可以组成一个水平梯形。

提示:

  • 4 <= points.length <= 10^5
  • --10^8 <= xi, yi <= 10^8
  • 所有点两两不同。

分析:题目说明必须要具有至少一对平行于 x 轴的边才算作水平梯形。统计所有具有相同 y 坐标的点数量,之后遍历每一行,如果这一行有 c 个点,那么从 c 个点中选 2 个点,有 c*(c−1)/2​ 种选法,可以组成一条水平边,即梯形的顶边或底边。之后再取其它另一行,求出另一条水平边的数量 k,相乘后加入答案。

cpp 复制代码
class Solution {
public:
    int countTrapezoids(vector<vector<int>>& points) {
        int mod=1e9+7,n=points.size();
        map<int,int>mp;
        for(int i=0;i<n;++i)
            mp[points[i][1]]++;
            
        long long ans=0,sum=0;
        for(auto it:mp)
        {
            int x=it.second;
            long long temp=1LL*x*(x-1)/2;
            ans+=sum*temp;
            sum+=temp;
        }
        return ans%mod;
    }
};
相关推荐
后来后来啊1 小时前
2026.2.2 & 2.3学习笔记
数据结构·笔记·学习·算法·leetcode
YuTaoShao1 小时前
【LeetCode 每日一题】3013. 将数组分成最小总代价的子数组 II
算法·leetcode·职场和发展
爱尔兰极光1 小时前
LeetCode 热题 100--字母异位词分组
算法·leetcode·职场和发展
im_AMBER1 小时前
Leetcode 112 两数相加 II
笔记·学习·算法·leetcode
sin_hielo2 小时前
leetcode 3637
数据结构·算法·leetcode
2401_841495642 小时前
【LeetCode刷题】翻转二叉树
python·算法·leetcode··递归·节点·翻转二叉树
小龙报2 小时前
【数据结构与算法】单链表的综合运用:1.合并两个有序链表 2.分割链表 3.环形链表的约瑟夫问题
c语言·开发语言·数据结构·c++·算法·leetcode·链表
sin_hielo2 小时前
leetcode 3013
数据结构·算法·leetcode
老鼠只爱大米2 小时前
LeetCode经典算法面试题 #105:从前序与中序遍历序列构造二叉树(分治递归法、栈辅助迭代法等五种实现方案详细解析)
算法·leetcode·二叉树·分治算法·前序遍历·迭代法·二叉树构造
芒克芒克11 小时前
LeetCode 题解:除自身以外数组的乘积
算法·leetcode