countLets Anruffenster 'minimal', wenn es nicht reduziert werden kann. D. h., Nach dem Erhöhen seines linken Randes oder Verringern seines rechten Randes ist es kein gültiges Fenster mehr (enthält nicht alle Elemente von B). Es gibt drei in Ihrem Beispiel: [0, 2], [2, 6], [6, 7]
Angenommen, Sie haben bereits das kleinste minimale Fenster gefunden [links, rechts]. ([0, 2] in Ihrem Beispiel) Jetzt schieben wir es einfach nach rechts.
// 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;
}
}
Dieses Verschieben funktioniert, weil verschiedene "minimale" Fenster einander nicht enthalten können.
Was ist "Fenster" in diesem Kontext? –
Beispiel: A = {1,3,2,4,5,6,1,2} B = {1,2} Das kleinste Fenster ist von Index 6 bis 7. – mousey
Muss das Fenster alle Elemente von B enthalten ? Ist die Reihenfolge wichtig? Oder, in Ihrem Beispiel, stellen die Positionen 2..6 auch ein Fenster dar, das B enthält? –