452. Número mínimo de flechas para hacer estallar globos [medio]

452. Problema de intervalo de número mínimo de flechas para hacer estallar globos

Descripción del problema

Hay muchos globos esféricos en un espacio bidimensional. Para cada globo, la entrada proporcionada son las coordenadas de inicio y finalización del diámetro del globo en la dirección horizontal. Dado que es horizontal, la ordenada no es importante, por lo que basta con conocer la abscisa del principio y el final. La coordenada inicial es siempre menor que la coordenada final.

Se puede disparar un arco y una flecha de forma completamente vertical desde diferentes puntos a lo largo del eje x. Dispara una flecha en la coordenada x. Si las coordenadas inicial y final del diámetro de un globo son xstart, xend y xstart ≤ x ≤ xend, el globo se detonará. No hay límite para la cantidad de arcos y flechas que se pueden disparar. Una vez que se disparan el arco y la flecha, pueden avanzar indefinidamente. Queremos encontrar el número mínimo de arcos y flechas necesarios para detonar todos los globos.

Te da una matriz de puntos, donde points [i] = [xstart, xend], devuelve el número mínimo de arcos y flechas que deben dispararse para detonar todos los globos.

Ejemplo 1:

输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:对于该样例,x = 6 可以射爆 [2,8],[1,6] 两个气球,以及 x = 11 射爆另外两个气球

Ejemplo 2:

输入:points = [[1,2],[3,4],[5,6],[7,8]]
输出:4

Ejemplo 3:

输入:points = [[1,2],[2,3],[3,4],[4,5]]
输出:2

Ejemplo 4:

输入:points = [[1,2]]
输出:1

Ejemplo 5:

输入:points = [[2,3],[2,3]]
输出:1

inmediato:

0 <= points.length <= 104
points[i].length == 2
-231 <= xstart < xend <= 231 - 1

respuesta

Esta pregunta es similar a 435. Es un problema de intervalo pero con diferencias sutiles.
Primero, analicemos el problema
. Para resolver el problema, la cantidad de flechas necesarias para atravesar todos los globos = use la menor cantidad de flechas posible y debe pasar a través de todos los intervalos.

  • Ordene el intervalo de acuerdo con el punto final derecho
  • Subproblema: comenzando desde el intervalo más a la izquierda, cuando colocamos la posición de la flecha en su punto final derecho, podemos garantizar el máximo beneficio
  • A continuación, continúe recorriendo para encontrar el intervalo donde el punto final izquierdo está a la derecha de la flecha anterior y continúe resolviéndolo de acuerdo con el paso anterior.

Código

class Solution {
    
    
    public int findMinArrowShots(int[][] points) {
    
    
        // 贪心问题:所需弓箭数量最小===弓箭尽可能穿过更多的气球
        // 和区间问题类似 排序
        // 当气球达到当前最左边区间的最右端时 为最大范围
        // 代码优化
        if(points.length == 0 || points == null ){
    
    
            return 0;
        }
        // 排序
        Arrays.sort(points,new Comparator<int[]>(){
    
    
            public int compare(int[] point1,int[] point2){
    
    
                if(point1[1]>point2[1]){
    
    
                    return 1;
                }else if(point1[1]<point2[1]){
    
    
                    return -1;
                }else{
    
    
                    return 0;
                }
            }
        });

        // 获取长度
        int length = points.length;
        // 准备弓箭计数
        int num = 1;
        // 设置右边界 right
        int right = points[0][1];
        for(int i=1;i<length;i++){
    
    
            if(points[i][0]>right){
    
    
                num++;
                right = points[i][1];
            }
        }
        return num;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_37747189/article/details/115130029
Recomendado
Clasificación