2017-07-21 4 views
0

Ich versuche, die längste zusammenhängende Untersequenz innerhalb eines Eingabearrays zu finden. Mein aktueller Code hat eine äußere Schleife, die eine Sequenz von jedem Index der Eingabe startet, und eine innere Schleife, die alle Elemente durchläuft, die dem Startindex folgen. Ich weiß, dass dies gelöst werden kann, indem man einfach einen Start- und Endindex setzt und einen Bereich des Arrays kopiert, aber ich kann nicht herausfinden, warum dieser Code eine Abnahme von einem Element zu einem anderen nicht erkennt. Wenn ich das Programm ausführe, druckt es immer noch das gesamte Eingabearray.Zunehmende zusammenhängende Untersequenz mit zwei Schleifen finden

import java.util.Arrays; 

public class LongestSubsequence { 

public static void longestForward(int[] input) { 
    int length = 1; 
    int longest = 1; 
    int[] currentSubsequence = new int[input.length]; 
    int[] longestSubsequence = new int[input.length]; 

    //Two loops: outer loop iterates through elements of the array 
    //and makes each one the starting index before executing inner loop 
    for (int i = 0; i < input.length-1; i++) { 
    currentSubsequence[i] = input[i]; 

    //next loop iterates through all proceeding elements in the array 
    //after the starting index 
    for (int j = i + 1; j < input.length; j++) { 
     //if the next element is greater than the previous element in the 
     // subsequence array, it is appended to the array 
     if(input[j] > currentSubsequence[j-1]) { 
     currentSubsequence[j] = input[j]; 
     length++; 
     } 
     //otherwise the length of the subsequence is compared to the 
     //longest so far, if it is bigger it sets the longest subsequence 
     //to the current subsequence 
     else if(input[j] < currentSubsequence[j-1]) { 
     if(length > longest) { 
      longest =length; 
      longestSubsequence = currentSubsequence; 
     } 
     } 
    } 
    } 
    int[] finalArray = Arrays.copyOfRange(longestSubsequence, 0, length); 
    System.out.println(Arrays.toString(finalArray)); 
} 

    public static void main (String[] args) { 
    int[] x = {1, 2, 3, 2, 6}; 
    longestForward(x); 
    } 
} 
+0

Bitte den Code einrücken. Es ist schwer zu folgen, wie es jetzt ist – litelite

Antwort

1

Sie haben vergessen, Ihre aktuelle Länge variabel zurück:

else if(input[j] < currentSubsequence[j-1]){ 
    if(length > longest){ 
     longest =length; 
     longestSubsequence = currentSubsequence; 
    } 
    length = 1; // Add this 
}  

EDIT:

Ich habe erkannt, wird dies das ganze Problem nicht beheben, ich glaube, Sie werden das erhalten müssen Startindex der längsten Sequenz und benutze das in der copyof.

+0

wow so eine einfache Lösung ... kann nicht glauben, dass ich es verpasst habe! Gibt es im Hinblick auf den Startindex eine Möglichkeit, dies zu vermeiden, und stattdessen das currentSubsequence-Array nach jeder Schleife zurückzusetzen? –

Verwandte Themen