2017-07-21 11 views
0

入力配列内で最も長い連続したサブシーケンスを見つけようとしています。私の現在のコードには、入力の各インデックスからシーケンスを開始する外側ループと、開始インデックスに続くすべての要素を反復処理する内側ループがあります。私はこれが単純に開始と終了のインデックスを設定し、配列の範囲をコピーすることで解決できることがわかっていますが、私はこのコードが要素間の減少を認識しない理由を理解できません。プログラムを実行すると、入力配列全体が出力されます。私は、これは全体の問題を解決しません、私はあなたが取得する必要があると思う実現2つのループで連続するサブシーケンスの増加を検出

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

EDIT:あなたの現在の長さ変数をリセットするのを忘れ

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

コードをインデントしてください。今のところそれに従うのは難しい – litelite

答えて

1

最長シーケンスのインデックスを開始し、それをcopyofで使用します。

+0

すごい簡単な修正...私はそれを逃したと信じられない!開始インデックスに関しては、これを回避し、代わりに各ループの後にcurrentSubsequence配列を「リセット」する方法がありますか? –

関連する問題