Encuentre el número mínimo de flechas necesarias para reventar todos los globos

Dada una array points[][] de tamaño N , donde points[i] representa un globo sobre el área de coordenadas X desde points[i][0] hasta points[i][1] . Las coordenadas Y no importan. Se requiere que todos los globos sean reventados. Para reventar un globo, se puede lanzar una flecha en el punto (x, 0) y viaja verticalmente hacia arriba y reventa todos los globos que cumplen la condición puntos[i][0] <= x <= puntos[i][1] . La tarea es encontrar el número mínimo de flechas necesarias para reventar todos los globos.

Ejemplos:

Entrada: N = 4, puntos = {{10, 16}, {2, 8}, {1, 6}, {7, 12}}
Salida: 2
Explicación: una forma es disparar una flecha, por ejemplo, a x = 6 (reventar los globos [2, 8] y [1, 6]) y otra flecha en x = 11 (reventar los otros dos globos).

Entrada: N = 1, puntos = {{1, 6}}
Salida: 1
Explicación: Una sola flecha puede reventar el globo.

 

Enfoque: El problema dado se puede resolver utilizando el Enfoque codicioso para encontrar los globos que se superponen entre sí para que la flecha pueda atravesar todos esos globos y reventarlos. Para hacerlo de manera óptima, ordene la array con respecto a la coordenada X en orden ascendente . Entonces, ahora considere 2 globos, si el segundo globo comienza antes que el primer globo, entonces debe terminar después del primer globo o en la misma posición.

Por ejemplo [1, 6], [2, 8] -> la posición inicial del segundo globo, es decir, 2, que está antes de la posición final del primer globo, es decir, 6, y dado que la array está ordenada, el final del segundo globo siempre es mayor que el final del primer globo. El segundo extremo del globo, es decir, 8, está después del final del primer globo, es decir, 6, lo que nos muestra que la superposición existe entre [2, 6].

Siga los pasos a continuación para resolver el problema:

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
bool cmp(vector<int> a, vector<int> b)
{
    return b[1] > a[1];
}
 
// Function to find the minimum count of
// arrows required to burst all balloons
int minArrows(vector<vector<int>> points)
{
   
    // To sort our array according
    // to end position of balloons
    sort(points.begin(), points.end(), cmp);
 
    // Initialize end variable with
    // the end of first balloon
    int end = points[0][1];
 
    // Initialize arrow with 1
    int arrow = 1;
 
    // Iterate through the entire
    // arrow of points
    for (int i = 1; i < points.size(); i++)
    {
 
        // If the start of ith balloon
        // <= end than do nothing
        if (points[i][0] <= end)
        {
            continue;
        }
 
        // if start of the next balloon
        // >= end of the first balloon
        // then increment the arrow
        else
        {
 
            // Update the new end
            end = points[i][1];
            arrow++;
        }
    }
 
    // Return the total count of arrows
    return arrow;
}
 
// Driver code
int main()
{
 
    vector<vector<int>> points = {{10, 16}, {2, 8}, {1, 6}, {7, 12}};
    cout << (minArrows(points));
    return 0;
}
 
// This code is contributed by Potta Lokesh

Java

// Java program for the above approach
import java.io.*;
import java.util.*;
 
class GFG {
 
    // Function to find the minimum count of
    // arrows required to burst all balloons
    public static int minArrows(int points[][])
    {
        // To sort our array according
        // to end position of balloons
        Arrays.sort(points,
                    (a, b) -> Integer.compare(a[1], b[1]));
 
        // Initialize end variable with
        // the end of first balloon
        int end = points[0][1];
 
        // Initialize arrow with 1
        int arrow = 1;
 
        // Iterate through the entire
        // arrow of points
        for (int i = 1; i < points.length; i++) {
 
            // If the start of ith balloon
            // <= end than do nothing
            if (points[i][0] <= end) {
                continue;
            }
 
            // if start of the next balloon
            // >= end of the first balloon
            // then increment the arrow
            else {
 
                // Update the new end
                end = points[i][1];
                arrow++;
            }
        }
 
        // Return the total count of arrows
        return arrow;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int[][] points
            = { { 10, 16 }, { 2, 8 }, { 1, 6 }, { 7, 12 } };
 
        System.out.println(
            minArrows(points));
    }
}

Python3

# Python3 program for the above approach
 
# Function to find the minimum count of
# arrows required to burst all balloons
def minArrows(points):
 
    # To sort our array according
    # to end position of balloons
    points = sorted(points,  key = lambda x:x[1])
 
    # Initialize end variable with
    # the end of first balloon
    end = points[0][1];
 
    # Initialize arrow with 1
    arrow = 1;
 
    # Iterate through the entire
    # arrow of points
    for i in range (1, len(points)) :
 
        # If the start of ith balloon
          # <= end than do nothing
        if (points[i][0] <= end) :
            continue;
     
 
        # if start of the next balloon
        # >= end of the first balloon
        # then increment the arrow
        else :
 
            # Update the new end
            end = points[i][1]       
            arrow = arrow + 1
    
    # Return the total count of arrows
    return arrow;
 
# Driver Code
points = [[10, 16 ], [ 2, 8 ], [1, 6 ], [ 7, 12 ]]
print(minArrows(points))
   
# This code is contributed by AR_Gaurav

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG {
 
    // Function to find the minimum count of
    // arrows required to burst all balloons
    public static int minArrows(int[][] points)
    {
        // To sort our array according
        // to end position of balloons
        // Array.Sort(points, (a, b) => {return a[1] - b[1];});
        Comparer<int> comparer = Comparer<int>.Default;
        Array.Sort<int[]>(points, (x,y) => comparer.Compare(x[1],y[1]));
         
 
        // Initialize end variable with
        // the end of first balloon
        int end = points[0][1];
 
        // Initialize arrow with 1
        int arrow = 1;
 
        // Iterate through the entire
        // arrow of points
        for (int i = 1; i < points.Length; i++) {
 
            // If the start of ith balloon
            // <= end than do nothing
            if (points[i][0] <= end) {
                continue;
            }
 
            // if start of the next balloon
            // >= end of the first balloon
            // then increment the arrow
            else {
 
                // Update the new end
                end = points[i][1];
                arrow++;
            }
        }
 
        // Return the total count of arrows
        return arrow;
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int[][] points
            = { new int[] { 10, 16 }, new int[] { 2, 8 }, new int[]{ 1, 6 }, new int[]{ 7, 12 } };
 
        Console.Write(minArrows(points));
    }
}
 
// This code is contributed by saurabh_jaiswal.

Javascript

<script>
// Javascript program for the above approach
 
function cmp(a, b) {
  return a[1] - b[1];
}
 
// Function to find the minimum count of
// arrows required to burst all balloons
function minArrows(points)
{
 
  // To sort our array according
  // to end position of balloons
  points.sort(cmp);
 
 
  // Initialize end variable with
  // the end of first balloon
  let end = points[0][1];
 
  // Initialize arrow with 1
  let arrow = 1;
 
  // Iterate through the entire
  // arrow of points
  for (let i = 1; i < points.length; i++) {
    // If the start of ith balloon
    // <= end than do nothing
    if (points[i][0] <= end) {
      continue;
    }
 
    // if start of the next balloon
    // >= end of the first balloon
    // then increment the arrow
    else {
      // Update the new end
      end = points[i][1];
      arrow++;
    }
  }
 
  // Return the total count of arrows
  return arrow;
}
 
// Driver code
let points = [
  [10, 16],
  [2, 8],
  [1, 6],
  [7, 12],
];
document.write(minArrows(points));
 
// This code is contributed by gfgking.
</script>
Producción: 

2

 

Complejidad de tiempo: O(N*log(N))
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por abhaybcg3 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 *