Sagen wir, ich habe ein Array A = {a1, a2, ..., an}Set Array min vorwärts und rückwärts über Rekursion
Angenommen, ein in Blöcke der Größe unterteilt ist b
Was ich versuche zu tun:
Lassen MinUntilHere und MinStartingHere sein 2-Arrays der Größe n, wobei gilt:
- MinUntilHere [i] = Minimum von Anfang Blocks i bis i
- MinStartingHere [i] = Minimum von i bis zum Ende des i-Block
ich diese 2 Felder ausfüllen möchten in einem einzigen Quer im Array ... ich habe versucht, den folgenden Pseudo-Code:
int fill(int pos = 0){
if(pos >= n) return INF
if(pos is the start index of a block){ //i % b == 0
MinUntilHere[pos] = A[pos]
MinStartingHere[pos] = min(A[pos], fill(i + 1))
}
else{
MinUntilHere[pos] = min(A[pos], A[pos - 1])
MinStartingHere[pos] = min(A[pos], fill(i + 1))
return MinStartingHere[pos]
}
}
aber wie Sie sehen können, ist es nicht vollständig, da sie nicht erkennen können, wenn jeder Block vorbei ist und einige kehren fehlen . Wie kann ich eine Funktion erstellen, die nur einmal durch das Array geht und meine Antworten berechnet?
Example:
Let A = {2,1,3,6,5,4}und b = 2 müssen die Arrays wie folgt gefüllt werden:
MinUntilHere = {2,1,3,3,5,4}
MinStartingHere = {1,1,3,6,4,4}
MinUntilHere [0 ] = 2 Ursache vom Anfang des 0-Blocks bis zum Index 0 ist das Minimum 2.
MinUntilHere [1] = 1 Ursache vom Anfang des Blocks 1 bis zum Index 1, das Minimum ist min (1,2) = 1
End of Example
Sollte nicht MinStartingHere sein {1,1,3,6,4,4}? –
@AbhishekBansal sicher, danke für die Hilfe, behoben :) – Daniel