题目
给定数组arr,返回arr的最长递增子序列。
举例
arr=[2,1,5,3,6,4,8,9,7],返回的最长递增子序列为[1,3,4,8,9]。
代码实现
public int[] getdp(int[] arr) {
int[] dp = new int[arr.length]; //dp[i]表示在以arr[i]这个数结尾的情况下,arr[0...i]中的最大递增子序列长度
for (int i = 0; i < arr.length; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
return dp;
}
public int[] generateLIS(int[] arr, int[] dp) {
int len = 0;
int index = 0;
for (int i = 0; i < dp.length; i++) { //遍历dp数组,找到最大值以及位置。
if (dp[i] > len) {
len = dp[i];
index = i;
}
}
int[] lis = new int[len];
lis[--len] = arr[index];
for (int i = index; i >= 0; i--) {
if (arr[i] < arr[index] && dp[i] == dp[index] - 1) {
lis[--len] = arr[i];
index = i;
}
}
return lis;
}
public int[] lis(int[] arr) {
if (arr == null || arr.length == 0) {
return null;
}
int[] dp = getdp(arr);
return generateLIS(arr, dp);
}