我正在嘗試使用二進制搜索來實現最長增加子序列。嗯,我的編碼算法和我的測試案例越來越滿意,但是當我提交的代碼,它失敗了一些測試情況下,像例如,對於下面的列表,使用二進制搜索的最長增加子序列
29471 5242 21175 28931 2889 7275 19159 21773 1325 6901,答案應該是4,但我得到5.Below是我的代碼,
import java.util.Scanner;
public class LongestIncreasingSubSequence {
public static int BS(int[] arr,int low,int high,int key){
int mid;
while ((high - low) > 1) {
mid = (int) Math.ceil((low + high)/2);
if (arr[mid] >= key) {
high = mid;
} else {
low = mid;
}
}
return high;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
n = sc.nextInt();
int arr[] = new int[n];
int LS[] = new int[arr.length];
int count = 1;
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
LS[0] = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < LS[0]) {
LS[0] = arr[i];
} else if (arr[i] > LS[count-1]) {
LS[count++] = arr[i];
} else {
LS[BS(arr,0,count-1,arr[i])] = arr[i];
}
}
System.out.println(count);
}
}
因此,誰能告訴我在哪裏,我提前去wrong.Thanks。
第一次輸入將是數組中的整數和下一行,我們將給出整數序列。 –
在子序列中,您不能更改順序。所以'LS [0] = arr [i];'不起作用,因爲'LS [1]'可能是'arr [i-1]' – njzk2
爲什麼不打印出找到的序列呢?如果多餘的一個是從開始或結束,或重複。 – weston