/ / Wie findet man alle Subarrays mit der Summe k in der O (n) -Zeitkomplexität? - Java, Arrays

Wie findet man alle Subarrays mit der Summe k in der O (n) -Zeitkomplexität? - Java, Arrays

Ich kann nach Subarrays mit einer Summe k mit folgendem Code suchen:

public static void subarraySum(int[] arr, int sum) {

int start=0;
int currSum=arr[0];

for(int i = 1;i<=arr.length;i++) {
while(currSum>sum ) {
currSum-=arr[start];
start++;
}
if(currSum==sum) {
System.out.println(start + " " + (i-1) + " index");
start=i;
currSum=0;
}
if(i<arr.length) {
currSum +=arr[i];
}

}

Dies funktioniert für Arrays wie {15,2,4,8,9,5,10,23}. Die Ausgabe hierfür ist 2 Unterfelder {2,4,9,8} und {23}.

Für Arrays wie {1,5,2,5,1,3} wird dies jedoch der Fall seingib mir nur als 1 Unterfeld, aber es gibt 2 Unterfelder mit der Summe 7, die {5,2} und {2,5} sind. Irgendwelche Vorschläge, wie man den obigen Code tweek, um die richtige Antwort im 2. Array zu geben?

Antworten:

3 für die Antwort № 1

Der Algorithmus ist nicht kompliziert, ich werde die Idee erklären und die Implementierung Ihnen überlassen, um es zu versuchen.

Sie müssen zwei Indizes haben, i, j, machen Sie siebeide beginnen mit dem ersten Element, nehmen nun das Unterfeld zwischen beiden (zunächst, da sie beide an derselben Stelle liegen, kein Unterfeld) und führen den folgenden Test durch.

  • Wenn die Summe gleich Ihrem Ziel ist, fügen Sie das aktuelle Unterfeld hinzu

  • Wenn die Summe kleiner als dein Ziel ist, bewege j nach rechts, um eins hinzuzufügen mehr Element und führen Sie den Test erneut durch

  • Wenn die Summe größer als dein Ziel ist, bewege i nach rechts, um sie zu entfernen das erste Element aus dem Subarray und führen Sie den Test erneut durch.

Am Ende werden Sie alle Unterfelder haben, deren Summe Ihrem Ziel entspricht

Bitte beachten Sie, dass diese Lösung nur für positive Zahlen funktioniert


0 für die Antwort № 2

Ja, ich bin zu langsam. Während ich dieses Problem gelöst habe, um einen Code zu geben, haben wir eine corrent algorytm Antwort. +1 dafür von mir und optional meine Lösung mit Code (Ich hatte diese Frage im Interview vor vielen Ohren):

public static List<int[]> subarraySum(int[] arr, int sum) {
List<int[]> res = new ArrayList<>();
int[] tmp;
int start = 0;  // inclusive
int end = 0;    // exclusive
int currSum = 0;

do {
if (end == arr.length && currSum < sum)
break;
if (currSum > sum)
currSum -= arr[start++];
else if (currSum < sum)
currSum += arr[end++];
else if (currSum == sum) {
res.add(tmp = new int[end - start]);
System.arraycopy(arr, start, tmp, 0, tmp.length);
currSum -= arr[start];
start++;
}
} while (start <= arr.length && end <= arr.length);

return res;
}

Es sieht korrekt aus, aber ich habe diese Lösung nur in einigen Fällen getestet.