Explicación detallada del problema de intervalo del algoritmo codicioso

contenido

1. Introducción a los algoritmos codiciosos

idea básica

limitación

2. Ejemplo clásico

problema de intervalo

estrategia codiciosa

3. Código


1. Introducción a los algoritmos codiciosos

idea básica

1) El algoritmo voraz (algoritmo codicioso) se refiere a tomar la mejor opción u óptima (es decir, la más favorable) en cada paso de la elección al resolver el problema, con la esperanza de conducir al algoritmo mejor u óptimo. .
2) El resultado obtenido por el algoritmo voraz no es necesariamente el resultado óptimo (a veces será la solución óptima), pero es el resultado que es relativamente aproximado (cercano a) la solución óptima.

limitación

Una gran razón por la que falla el algoritmo codicioso es su limitación obvia: casi solo considera los óptimos locales. La llamada optimización local es considerar solo los mejores intereses actuales, no mirar un paso adelante ni un paso atrás, de modo que solo se use la solución óptima de la etapa actual cada vez. Por lo tanto, en la mayoría de los casos, el algoritmo voraz no puede obtener la solución óptima global, pero su solución es una buena aproximación de la solución óptima.

2. Ejemplo clásico

problema de intervalo

Dados varios intervalos, calcule el número mínimo de intervalos que se eliminarán para que no se superpongan. Las conexiones iniciales y finales no cuentan como superposición.

Ejemplo de entrada y salida


La entrada es una matriz que consta de múltiples matrices con una longitud fija de 2, que representa el inicio y el final del intervalo.

Muestra un número entero que representa el número de intervalos que se eliminarán.


Entrada:[1,2],[2,4],[1,3]]


Salida: 1

En este ejemplo, podemos eliminar el intervalo [1,3] para que los intervalos restantes [1,2],[2,4]] no se superpongan entre sí.

estrategia codiciosa

Al elegir un intervalo para mantener, el final del intervalo es importante: cuanto más pequeño sea el final del intervalo que elija, más espacio le quedará para otros intervalos
y más intervalos podrá mantener.

Por lo tanto, la estrategia codiciosa que adoptamos es mantener preferentemente los intervalos con finales pequeños e intervalos disjuntos. El método de implementación específico es:

1. Primero ordene el intervalo en orden creciente según el tamaño del final ,

2. Cada vez que seleccione el intervalo con el final más pequeño y que no se superponga con el intervalo seleccionado previamente.

En el ejemplo, la matriz ordenada es [1,2],[1,3],[2,4]]. De acuerdo con nuestra estrategia codiciosa, primero inicializamos en el intervalo [1,2]; dado que [1,3] se cruza con [1,2], omitimos este intervalo; dado que [2,4] no se cruza con [1, 2] , lo mantenemos. Por lo tanto, el último intervalo reservado es [1,2], [2,4].

3. Código

import java.util.Arrays;
import java.util.Comparator;

public class Solution {
	public static int merge(int[][] intervals) {
		//先按照区间结尾的大小进行升序排序
		Arrays.sort(intervals, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return o1[1] - o2[1];
			}
		});
		int count =1;//区间不重合的个数,默认第一个满足题意,初始化为1
		int cur = intervals[0][1];//排序完成后贪心选择的最小的区间结尾
		for (int i = 1; i < intervals.length; i++) {
			if(intervals[i][0] >= cur) {
				count++;
				cur=intervals[i][1];
			}
		}
        //所有区间的个数减去不重叠区间的个数,就是重叠区间的个数。
		return intervals.length - count;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_52360069/article/details/123596797
Recomendado
Clasificación