在二维空间中给定N个点。任务是计算三元组对(A,B,C)的数量,以使点B是由连接点A和C形成的线段的中点。
例子:
Input: points = {{1, 1}, {2, 2}, {3, 3}}
Output: 1
The point (2, 2) is the midpoint of the line segment joining points (1, 1) and (3, 3).
Input: points = {{1, 1}, {1, 2}, {1, 5}}
Output: 0
方法:考虑一对点A和C。连接这些点的线段的中点将是((A * X + C * X)/ 2,(A * Y + C * Y)/ 2)) 。如果该点存在于给定的点列表中,则说明已找到一个三元组。为了快速检查一个点是否在我们的点列表中,我们可以使用一个集合。对所有点对执行此操作将为我们提供所需的计数。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return the count of possible triplets
int countTriplets(int n, vector > points)
{
set > pts;
int ct = 0;
// Insert all the points in a set
for (int i = 0; i < n; i++)
pts.insert(points[i]);
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++) {
int x = points[i].first + points[j].first;
int y = points[i].second + points[j].second;
// If the mid point exists in the set
if (x % 2 == 0 && y % 2 == 0)
if (pts.find(make_pair(x / 2, y / 2))
!= pts.end())
ct++;
}
// Return the count of valid triplets
return ct;
}
// Driver code
int main()
{
vector > points
= { { 1, 1 }, { 2, 2 }, { 3, 3 } };
int n = points.size();
cout << countTriplets(n, points);
}
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
static class pair
{
int first,second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to return the count of possible triplets
static int countTriplets(int n, Vector points)
{
Set pts = new HashSet();
int ct = 0;
// Insert all the points in a set
for (int i = 0; i < n; i++)
pts.add(points.get(i));
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
{
int x = points.get(i).first + points.get(j).first;
int y = points.get(i).second + points.get(j).second;
// If the mid point exists in the set
if (x % 2 == 0 && y % 2 == 0)
if (!pts.contains(new pair(x / 2, y / 2)))
ct++;
}
// Return the count of valid triplets
return ct;
}
// Driver code
public static void main(String args[])
{
Vector points = new Vector<>();
points.add(new pair(1,1));
points.add(new pair(2,2));
points.add(new pair(3,3));
int n = points.size();
System.out.println(countTriplets(n, points));
}
}
// This code is contributed by Princi Singh
Python3
# Python3 implementation of the approach
# Function to return the count
# of possible triplets
def countTriplets(n, points) :
pts = []
ct = 0;
# Insert all the points in a set
for i in range(n) :
pts.append(points[i]);
for i in range(n) :
for j in range(i + 1, n) :
x = points[i][0] + points[j][0];
y = points[i][1] + points[j][1];
# If the mid point exists in the set
if (x % 2 == 0 and y % 2 == 0) :
if [x // 2, y // 2] in pts :
ct += 1
# Return the count of valid triplets
return ct
# Driver code
if __name__ == "__main__" :
points = [[ 1, 1 ], [ 2, 2 ], [ 3, 3 ]]
n = len(points)
print(countTriplets(n, points))
# This code is contributed by Ryuga
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
class GFG
{
public class pair
{
public int first,second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to return the count of possible triplets
static int countTriplets(int n, List points)
{
HashSet pts = new HashSet();
int ct = 0;
// Insert all the points in a set
for (int i = 0; i < n; i++)
pts.Add(points[i]);
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
{
int x = points[i].first + points[j].first;
int y = points[i].second + points[j].second;
// If the mid point exists in the set
if (x % 2 == 0 && y % 2 == 0)
if (!pts.Contains(new pair(x / 2, y / 2)))
ct++;
}
// Return the count of valid triplets
return ct;
}
// Driver code
public static void Main(String []args)
{
List points = new List();
points.Add(new pair(1, 1));
points.Add(new pair(2, 2));
points.Add(new pair(3, 3));
int n = points.Count;
Console.WriteLine(countTriplets(n, points));
}
}
// This code is contributed by 29AjayKumar
PHP
输出:
1