我正在尝试使用二进制搜索来实现最长的增加子序列。好吧,我已经对算法进行了编码,我的测试用例也得到了满足,但是当我提交代码时,对于某些测试用例来说失败了,例如以下列表,
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);
}
}
所以任何人都可以告诉我我哪里错了。谢谢。
答案 0 :(得分:1)
这里有一个错误:
LS[BS(arr,0,count-1,arr[i])] = arr[i];
应该是
而是LS[BS(LS,0,count-1,arr[i])] = arr[i];
,因为我们需要为增加的子序列(即LS
)的每个长度更新具有最小值的数组,而不是原始数组。
通过这个更改,它可以在您的测试用例上正常工作(我还没有对其他任何测试,但现在算法对我来说是正确的)。