Encuentre el área mínima del rectángulo con un conjunto dado de coordenadas

Dada una array  arr     de conjunto de puntos en el plano XY . La tarea es encontrar el área mínima de un rectángulo que se puede formar a partir de estos puntos. Los lados del rectángulo deben ser paralelos a los ejes X e Y. Si no se puede formar un rectángulo con los puntos dados, imprima  0     .
Ejemplos: 
 

Entrada: arr[][] = [[1, 1], [1, 3], [3, 1], [3, 3], [2, 2]] 
Salida:
El único rectángulo posible se formará con los puntos (1, 1), (1, 3), (3, 1) y (3, 3)
Entrada: arr[][] = [[1, 1], [1, 3], [3, 1 ], [3, 3], [4, 1], [4, 3]] 
Salida:
 

Aproximación: Agrupe los puntos por  X     coordenadas, de modo que los puntos en líneas verticales rectas se agrupen. Luego, para cada par de puntos en un grupo, por ej. coordenadas (X, Y1) y (X, Y2), buscamos el rectángulo más pequeño con este par de puntos como el borde más a la derecha del rectángulo que se va a formar. Podemos hacer esto haciendo un seguimiento de todos los otros pares de puntos que hemos visitado antes. Finalmente devuelva el área mínima posible del rectángulo obtenido.
A continuación se muestra la implementación del enfoque anterior: 
 

CPP

// C++ Implementation of above approach
#include <bits/stdc++.h>
using namespace std;
 
// function to find minimum area of Rectangle
int minAreaRect(vector<vector<int>> A){
 
    // creating empty columns
    map<int,vector<int>> columns;
 
    // fill columns with coordinates
    for(auto i:A)
        columns[i[0]].push_back(i[1]);
 
    map<pair<int,int>,int > lastx;
 
    int ans = INT_MAX;
 
    for (auto x:columns)
    {
        vector<int> column = x.second;
        sort(column.begin(), column.end());
        for (int j = 0; j < column.size(); j++)
        {
            for (int i = 0; i < j; i++)
            {
                int y1 = column[i];
 
                // check if rectangle can be formed
                if (lastx.find({y1, column[j]}) != lastx.end())
                {
                    ans = min(ans, (x.first - lastx[{y1, column[j]}]) *
                            (column[j] - column[i]));
                }
                lastx[{y1, column[j]}] = x.first;
            }
            }
        }
 
    if (ans < INT_MAX)
        return ans;
    else
        return 0;
}
 
// Driver code
int main()
{
    vector<vector<int>> A = {{1, 1}, {1, 3}, {3, 1}, {3, 3}, {2, 2}};
    cout << (minAreaRect(A));
    return 0;
}
 
// This code is contributed by mohit kumar 29

Java

/*package whatever //do not write package name here */
// Java Implementation of above approach
import java.io.*;
import java.util.*;
 
class GFG {
 
  //# function to find minimum area of Rectangle
  public static int minAreaRect(int[][] points)
  {
 
    // creating empty columns
    @SuppressWarnings("unchecked")
    Set<Integer> columns = new HashSet();
 
    // fill columns with coordinates
    for (int[] point : points)
      columns.add(40001 * point[0] + point[1]);
 
    int ans = Integer.MAX_VALUE;
    for (int i = 0; i < points.length; ++i)
      for (int j = i + 1; j < points.length; ++j) {
        if (points[i][0] != points[j][0]
            && points[i][1] != points[j][1]) {
          if (columns.contains(40001
                               * points[i][0]
                               + points[j][1])
              && columns.contains(
                40001 * points[j][0]
                + points[i][1])) {
            ans = Math.min( ans, Math.abs(points[j][0]
                            - points[i][0])
              * Math.abs(points[j][1]
                         - points[i][1]));
          }
        }
      }
 
    return ans < Integer.MAX_VALUE ? ans : 0;
  }
   
  // Driver code
  public static void main(String[] args)
  {
 
    int[][] A = {{1, 1}, {1, 3}, {3, 1}, {3, 3}, {2, 2}};
    System.out.println(minAreaRect(A));
  }
}
 
// This code is contributed by maheshwaripiyush9

Python

# Python Implementation of above approach
import collections
 
# function to find minimum area of Rectangle
def minAreaRect(A):
 
    # creating empty columns
    columns = collections.defaultdict(list)
 
    # fill columns with coordinates
    for x, y in A:
        columns[x].append(y)
 
    lastx = {}
    ans = float('inf')
 
    for x in sorted(columns):
        column = columns[x]
        column.sort()
        for j, y2 in enumerate(column):
            for i in range(j):
                y1 = column[i]
 
                # check if rectangle can be formed
                if (y1, y2) in lastx:
                    ans = min(ans, (x - lastx[y1, y2]) * (y2 - y1))
                lastx[y1, y2] = x
 
    if ans < float('inf'):
        return ans
    else:
        return 0
 
# Driver code
A = [[1, 1], [1, 3], [3, 1], [3, 3], [2, 2]]
print(minAreaRect(A))

Javascript

<script>
/*package whatever //do not write package name here */
// Javascript Implementation of above approach
     
    //# function to find minimum area of Rectangle
    function minAreaRect(points)
    {
        // creating empty columns
    let columns = new Set();
  
    // fill columns with coordinates
    for (let point=0;point<points.length;point++)
      columns.add(40001 * points[point][0] + points[point][1]);
  
    let ans = Number.MAX_VALUE;
    for (let i = 0; i < points.length; ++i)
      for (let j = i + 1; j < points.length; ++j) {
        if (points[i][0] != points[j][0]
            && points[i][1] != points[j][1]) {
          if (columns.has(40001
                               * points[i][0]
                               + points[j][1])
              && columns.has(
                40001 * points[j][0]
                + points[i][1])) {
            ans = Math.min( ans, Math.abs(points[j][0]
                            - points[i][0])
              * Math.abs(points[j][1]
                         - points[i][1]));
          }
        }
      }
  
    return ans < Number.MAX_VALUE ? ans : 0;
    }
     
    // Driver code
    let A = [[1, 1], [1, 3], [3, 1], [3, 3], [2, 2]];
    document.write(minAreaRect(A));
     
     
// This code is contributed by patel2127
</script>
Producción: 

4

 

Complejidad de tiempo: O (N * N), ya que estamos usando bucles anidados.

Espacio auxiliar: O(N*N), ya que estamos usando espacio extra.

Publicación traducida automáticamente

Artículo escrito por Sanjit_Prasad y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *