Minimum number of points to be removed to get remaining points on one side of axis
We are given n points in a Cartesian plane. Our task is to find the minimum number of points that should be removed in order to get the remaining points on one side of any axis.
Examples :
Input : 4 1 1 2 2 -1 -1 -2 2 Output : 1 Explanation : If we remove (-1, -1) then all the remaining points are above x-axis. Thus the answer is 1. Input : 3 1 10 2 3 4 11 Output : 0 Explanation : All points are already above X-axis. Hence the answer is 0.
Approach :
This problem is a simple example of a constructive brute force algorithm on Geometry. The solution can be approached simply by finding the number of points on all sides of the X-axis and Y-axis. The minimum of this will be the answer.
C++
// CPP program to find minimum points to be moved // so that all points are on same side. #include <bits/stdc++.h> using namespace std; typedef long long ll; // Structure to store the coordinates of a point. struct Point { int x, y; }; // Function to find the minimum number of points int findmin(Point p[], int n) { int a = 0, b = 0, c = 0, d = 0; for ( int i = 0; i < n; i++) { // Number of points on the left of Y-axis. if (p[i].x <= 0) a++; // Number of points on the right of Y-axis. else if (p[i].x >= 0) b++; // Number of points above X-axis. if (p[i].y >= 0) c++; // Number of points below X-axis. else if (p[i].y <= 0) d++; } return min({a, b, c, d}); } // Driver Function int main() { Point p[] = { {1, 1}, {2, 2}, {-1, -1}, {-2, 2} }; int n = sizeof (p)/ sizeof (p[0]); cout << findmin(p, n); return 0; } |
Java
// Java program to find minimum points to be moved // so that all points are on same side. import java.util.*; class GFG { // Structure to store the coordinates of a point. static class Point { int x, y; public Point( int x, int y) { this .x = x; this .y = y; } }; // Function to find the minimum number of points static int findmin(Point p[], int n) { int a = 0 , b = 0 , c = 0 , d = 0 ; for ( int i = 0 ; i < n; i++) { // Number of points on the left of Y-axis. if (p[i].x <= 0 ) a++; // Number of points on the right of Y-axis. else if (p[i].x >= 0 ) b++; // Number of points above X-axis. if (p[i].y >= 0 ) c++; // Number of points below X-axis. else if (p[i].y <= 0 ) d++; } return Math.min(Math.min(a, b), Math.min(c, d)); } // Driver Code public static void main(String[] args) { Point p[] = { new Point( 1 , 1 ), new Point( 2 , 2 ), new Point(- 1 , - 1 ), new Point(- 2 , 2 )}; int n = p.length; System.out.println(findmin(p, n)); } } // This code is contributed by PrinciRaj1992 |
Python3
# Python3 program to find minimum points to be # moved so that all points are on same side. # Function to find the minimum number # of points def findmin(p, n): a, b, c, d = 0 , 0 , 0 , 0 for i in range (n): # Number of points on the left # of Y-axis. if (p[i][ 0 ] < = 0 ): a + = 1 # Number of points on the right # of Y-axis. elif (p[i][ 0 ] > = 0 ): b + = 1 # Number of points above X-axis. if (p[i][ 1 ] > = 0 ): c + = 1 # Number of points below X-axis. elif (p[i][ 1 ] < = 0 ): d + = 1 return min ([a, b, c, d]) # Driver Code p = [ [ 1 , 1 ], [ 2 , 2 ], [ - 1 , - 1 ], [ - 2 , 2 ] ] n = len (p) print (findmin(p, n)) # This code is contributed by Mohit Kumar |
C#
// C# program to find minimum points to be moved // so that all points are on same side. using System; class GFG { // Structure to store the coordinates of a point. public class Point { public int x, y; public Point( int x, int y) { this .x = x; this .y = y; } }; // Function to find the minimum number of points static int findmin(Point []p, int n) { int a = 0, b = 0, c = 0, d = 0; for ( int i = 0; i < n; i++) { // Number of points on the left of Y-axis. if (p[i].x <= 0) a++; // Number of points on the right of Y-axis. else if (p[i].x >= 0) b++; // Number of points above X-axis. if (p[i].y >= 0) c++; // Number of points below X-axis. else if (p[i].y <= 0) d++; } return Math.Min(Math.Min(a, b), Math.Min(c, d)); } // Driver Code public static void Main(String[] args) { Point []p = { new Point(1, 1), new Point(2, 2), new Point(-1, -1), new Point(-2, 2)}; int n = p.Length; Console.WriteLine(findmin(p, n)); } } // This code is contributed by Princi Singh |
Javascript
<script> // JavaScript program to find minimum points to be moved // so that all points are on same side. // Function to find the minimum number of points function findmin(p,n) { let a = 0, b = 0, c = 0, d = 0; for (let i = 0; i < n; i++) { // Number of points on the left of Y-axis. if (p[i][0] <= 0) a++; // Number of points on the right of Y-axis. else if (p[i][0] >= 0) b++; // Number of points above X-axis. if (p[i][1] >= 0) c++; // Number of points below X-axis. else if (p[i][1] <= 0) d++; } return Math.min(Math.min(a, b), Math.min(c, d)); } // Driver Code let p = [ [1, 1], [2, 2], [-1, -1], [-2, 2] ] let n = p.length; document.write(findmin(p, n)); // This code is contributed by unknown2108 </script> |
Output:
1
Time Complexity: O(n)
Auxiliary Space: O(1)
Please suggest if someone has a better solution which is more efficient in terms of space and time.
This article is contributed by Aarti_Rathi. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above