找出由n个数字组成的序列的最长单调递增子序列。
// 错误代码(试图找到以某个元素开头的最长递增子序列)
public void maxLis(int[] nums) // 1 2 7 6 8 3 4
{
int n = nums.length;
int c = 0;
int len = 1; // 递增子序列长度
int maxLen = 0x80000000; // 最长递增子序列长度
for (int i=0; i<n; i++)
{
c = nums[i];
for (int j=i+1; j<n; j++)
{
if (c < nums[j])
{
c = nums[j];
len++;
}
}
// 内层for结束后,就找到了以下标i开头的最长的子序列长度
maxLen = maxLen > len ? maxLen : len;
len = 1;
}
System.out.println("maxLen: "+maxLen);
}
修改之后:
用数组b[0:n-1]记录以a[i],0<=i<=n,为结尾元素的最长递增子序列的长度。
int lisDyna(int[] a)
{
int i, j;
int n = a.length;
int k = 0;
int [] b = new int[a.length];
b[0] = 1; // 表示以a[0]为结尾元素的最长递增子序列长度为1
for (i=1; i<n; i++)
{
for (j=0, k=0; j<i; j++) // 1, 2, 7, 6, 9, 3, 4, 5
{
if (a[j] <= a[i] && k < b[j]) // 当前元素小于结尾元素,且以当前元素结尾的子序列长度更长
k = b[j];
}
b[i] = k+1;
}
return maxL(n, b);
}
// 打擂台
int maxL(int n, int[] b)
{
int tmp = 0;
for (int i=0; i<n; i++)
if (b[i] > tmp)
tmp = b[i];
return tmp;
}