在二维平面中给定N个点。如果两个点的X坐标相同并且第一个点的Y坐标大于第二个点的Y坐标,则称该点在另一个点的上方。同样,我们在下方定义左右。任务是计算在其上,下,左或右至少有一个点的点数。
例子:
Input: arr[] = {{0, 0}, {0, 1}, {1, 0}, {0, -1}, {-1, 0}}
Output: 1
The only point which satisfies the condition is the point (0, 0).
Input: arr[] = {{0, 0}, {1, 0}, {0, -2}, {5, 0}}
Output: 0
方法:对于每个X坐标,在具有该X坐标的所有点中找到2个值,即最小和最大Y坐标。对每个Y坐标执行相同的操作。现在,要满足约束条件的点,其Y坐标必须位于该X坐标的2个计算值之间。检查同一事物的X坐标。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
#define MX 2001
#define OFF 1000
// Represents a point in 2-D space
struct point {
int x, y;
};
// Function to return the count of
// required points
int countPoints(int n, struct point points[])
{
int minx[MX];
int miny[MX];
// Initialize minimum values to infinity
fill(minx, minx + MX, INT_MAX);
fill(miny, miny + MX, INT_MAX);
// Initialize maximum values to zero
int maxx[MX] = { 0 };
int maxy[MX] = { 0 };
int x, y;
for (int i = 0; i < n; i++) {
// Add offset to deal with negative
// values
points[i].x += OFF;
points[i].y += OFF;
x = points[i].x;
y = points[i].y;
// Update the minimum and maximum
// values
minx[y] = min(minx[y], x);
maxx[y] = max(maxx[y], x);
miny[x] = min(miny[x], y);
maxy[x] = max(maxy[x], y);
}
int count = 0;
for (int i = 0; i < n; i++) {
x = points[i].x;
y = points[i].y;
// Check if condition is satisfied
// for X coordinate
if (x > minx[y] && x < maxx[y])
// Check if condition is satisfied
// for Y coordinate
if (y > miny[x] && y < maxy[x])
count++;
}
return count;
}
// Driver code
int main()
{
struct point points[] = { { 0, 0 },
{ 0, 1 },
{ 1, 0 },
{ 0, -1 },
{ -1, 0 } };
int n = sizeof(points) / sizeof(points[0]);
cout << countPoints(n, points);
}
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
static int MX = 2001;
static int OFF = 1000;
// Represents a point in 2-D space
static class point
{
int x, y;
public point(int x, int y)
{
this.x = x;
this.y = y;
}
};
// Function to return the count of
// required points
static int countPoints(int n, point points[])
{
int []minx = new int[MX];
int []miny = new int[MX];
// Initialize minimum values to infinity
for (int i = 0; i < n; i++)
{
minx[i]=Integer.MAX_VALUE;
miny[i]=Integer.MAX_VALUE;
}
// Initialize maximum values to zero
int []maxx = new int[MX];
int []maxy = new int[MX];
int x, y;
for (int i = 0; i < n; i++)
{
// Add offset to deal with negative
// values
points[i].x += OFF;
points[i].y += OFF;
x = points[i].x;
y = points[i].y;
// Update the minimum and maximum
// values
minx[y] = Math.min(minx[y], x);
maxx[y] = Math.max(maxx[y], x);
miny[x] = Math.min(miny[x], y);
maxy[x] = Math.max(maxy[x], y);
}
int count = 0;
for (int i = 0; i < n; i++)
{
x = points[i].x;
y = points[i].y;
// Check if condition is satisfied
// for X coordinate
if (x > minx[y] && x < maxx[y])
// Check if condition is satisfied
// for Y coordinate
if (y > miny[x] && y < maxy[x])
count++;
}
return count;
}
// Driver code
public static void main(String[] args)
{
point points[] = {new point(0, 0),
new point(0, 1),
new point(1, 0),
new point(0, -1),
new point(-1, 0)};
int n = points.length;
System.out.println(countPoints(n, points));
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 implementation of the approach
from sys import maxsize as INT_MAX
MX = 2001
OFF = 1000
# Represents a point in 2-D space
class point:
def __init__(self, x, y):
self.x = x
self.y = y
# Function to return the count of
# required points
def countPoints(n: int, points: list) -> int:
# Initialize minimum values to infinity
minx = [INT_MAX] * MX
miny = [INT_MAX] * MX
# Initialize maximum values to zero
maxx = [0] * MX
maxy = [0] * MX
x, y = 0, 0
for i in range(n):
# Add offset to deal with negative
# values
points[i].x += OFF
points[i].y += OFF
x = points[i].x
y = points[i].y
# Update the minimum and maximum
# values
minx[y] = min(minx[y], x)
maxx[y] = max(maxx[y], x)
miny[x] = min(miny[x], y)
maxy[x] = max(maxy[x], y)
count = 0
for i in range(n):
x = points[i].x
y = points[i].y
# Check if condition is satisfied
# for X coordinate
if (x > minx[y] and x < maxx[y]):
# Check if condition is satisfied
# for Y coordinate
if (y > miny[x] and y < maxy[x]):
count += 1
return count
# Driver Code
if __name__ == "__main__":
points = [point(0, 0),
point(0, 1),
point(1, 0),
point(0, -1),
point(-1, 0)]
n = len(points)
print(countPoints(n, points))
# This code is contributed by
# sanjeev2552
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
class GFG
{
static int MX = 2001;
static int OFF = 1000;
// Represents a point in 2-D space
public class point
{
public int x, y;
public point(int x, int y)
{
this.x = x;
this.y = y;
}
};
// Function to return the count of
// required points
static int countPoints(int n, point []points)
{
int []minx = new int[MX];
int []miny = new int[MX];
// Initialize minimum values to infinity
for (int i = 0; i < n; i++)
{
minx[i]=int.MaxValue;
miny[i]=int.MaxValue;
}
// Initialize maximum values to zero
int []maxx = new int[MX];
int []maxy = new int[MX];
int x, y;
for (int i = 0; i < n; i++)
{
// Add offset to deal with negative
// values
points[i].x += OFF;
points[i].y += OFF;
x = points[i].x;
y = points[i].y;
// Update the minimum and maximum
// values
minx[y] = Math.Min(minx[y], x);
maxx[y] = Math.Max(maxx[y], x);
miny[x] = Math.Min(miny[x], y);
maxy[x] = Math.Max(maxy[x], y);
}
int count = 0;
for (int i = 0; i < n; i++)
{
x = points[i].x;
y = points[i].y;
// Check if condition is satisfied
// for X coordinate
if (x > minx[y] && x < maxx[y])
// Check if condition is satisfied
// for Y coordinate
if (y > miny[x] && y < maxy[x])
count++;
}
return count;
}
// Driver code
public static void Main(String[] args)
{
point []points = {new point(0, 0),
new point(0, 1),
new point(1, 0),
new point(0, -1),
new point(-1, 0)};
int n = points.Length;
Console.WriteLine(countPoints(n, points));
}
}
// This code is contributed by 29AjayKumar
输出:
1
时间复杂度: O(N)