CountLet llama a la ventana 'mínima' si no se puede reducir. Es decir, después de aumentar su margen izquierdo o disminuir su borde derecho ya no es una ventana válida (no contiene todos los elementos de B). Hay tres en el ejemplo: [0, 2], [2, 6], [6, 7]
Asumamos decir que usted ya ha encontrado más a la izquierda ventana mínima [izquierda, derecha]. ([0, 2] en su ejemplo) Ahora simplemente lo deslizaremos hacia la derecha.
// count[x] tells how many times number 'x'
// happens between 'left' and 'right' in 'A'
while (right < N - 1) {
// move right border by 1
++right;
if (A[right] is in B) {
++count[A[right]];
}
// check if we can move left border now
while (count[A[left]] > 1) {
--count[A[left]];
++left;
}
// check if current window is optimal
if (right - left + 1 < currentMin) {
currentMin = right - left + 1;
}
}
Este deslizamiento funciona porque las diferentes ventanas "mínimas" no pueden contenerse entre sí.
¿Qué es "ventana" en este contexto? –
ex: A = {1,3,2,4,5,6,1,2} B = {1,2} por lo que la ventana más pequeña es del índice 6 a 7. – mousey
¿Tiene que contener la ventana todos los elementos de B? ? Es importante la orden? O, en su ejemplo, ¿las posiciones 2..6 también constituyen una ventana que contiene B? –