LeeCode (analógico) 57_intervalo de inserción

LeeCode (analógico) 57_intervalo de inserción

Tema: proporcione
una lista de intervalos sin superposición, ordenados por los puntos de inicio y finalización del intervalo.

Para insertar un nuevo intervalo en la lista, debe asegurarse de que los intervalos de la lista aún estén en orden y no se superpongan (si es necesario, puede fusionar los intervalos).

Ejemplo 1:

Entrada: intervalos = [[1,3], [6,9]], newInterval = [2,5]
Salida: [[1,5], [6,9]]
Ejemplo 2:

Entrada: intervalos = [[1,2], [3,5], [6,7], [8,10], [12,16]], newInterval = [4,8]
Salida: [[1,2 ], [3,10], [12,16]]
Explicación: Esto se debe a que el nuevo intervalo [4,8] se superpone con [3,5], [6,7], [8,10].

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/insert-interval
Copyright es propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Ideas para la resolución de problemas:
algunos estudiantes que han aprendido sistemas operativos ven este problema, deberían estar familiarizados con él. Sí, la idea de esta pregunta es muy similar al principio del algoritmo de recuperación de memoria de la gestión de memoria en el sistema operativo.

Método uno: simulación

Al insertar este intervalo, habrá tres situaciones: a continuación, l representa el límite izquierdo del intervalo y r representa el límite derecho del intervalo.

  1. Inserte el intervalo s a la izquierda del intervalo actual i, es decir, sl> ir
  2. Inserte el intervalo s a la derecha del intervalo actual i, es decir, sr> il
  3. De lo contrario, el intervalo insertado tiene una intersección con el intervalo actual.

Cuando se encuentra il> sr, significa que la coordenada izquierda del intervalo restante debe ser mayor que la coordenada derecha de s.

Código Java:

import java.util.ArrayList;
import java.util.List;

public class 插入区间 {
    
    
	public int[][] insert(int[][] intervals, int[] newInterval) {
    
    
		int left = newInterval[0];
		int right = newInterval[1];
		boolean placed = false;
		List<int[]> ansList = new ArrayList<>();
		
		for(int interval[]:intervals){
    
    
			if(interval[0]>right){
    
    
				if(!placed){
    
    
					ansList.add(new int[]{
    
    left, right});
					placed=true;
				}
				ansList.add(interval);
			}else if(interval[1]<left){
    
    
				ansList.add(interval);
			}else{
    
    
				left = Math.min(left, interval[0]);
				right = Math.max(right, interval[1]);
			}
			
		}
		
		if(!placed){
    
    
			ansList.add(new int[]{
    
    left, right});
		}
		
		int[][] ans = new int[ansList.size()][2];
		
		for(int i=0;i<ans.length;i++){
    
    
			ans[i] = ansList.get(i);
		}
		
		return ans;
    }
}

Supongo que te gusta

Origin blog.csdn.net/u013456390/article/details/112729142
Recomendado
Clasificación