最长递增子序列
题目描述:
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
这个题我一开始想的是动态规划,但是这方面不是很熟练,以至于有点思路,但不多,事后有重新看了这道题目,发现跟我之前做的一个题目有些类似(连续最大子数组的和),但是我脑子转的比较慢,这也是之后才发现的…
思路:
题目要求的是最长递增子序列,比较关键的点在于在两个数比较时,通过已知的第 j 个数的递增子序列的个数,来确定当前第 i 个数的递增子序列的个数( j < i ,前提是要先求出之前的数的递增子序列个数)。引入一个辅助数组来记录目标数组中的每个数的递增子序列的个数,目标数组的第一个数的递增子序列一定是 1,通过两次遍历逐个计算出每个数的递增子序列个数,最后在找出辅助数组中的最大值即可。
代码:
public int lengthOfLIS(int[] nums) {
int n = nums.length;
int[] x = new int[n];
for (int i = 0; i < n; i++) {
x[i] = 1;
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if(nums[j] < nums[i]){
x[i] = Math.max(x[j]+1,x[i]);
}
}
}
Arrays.sort(x);
return x[n-1];
}
之后在下面也看了一些动态规划的解题思路,大致有五步:
辅助数组的定义,辅助数组的初始化,递推公式,遍历方式,以及出现错误时通过打印辅助数组来查看错误。
这也只是一个笼统的大致步骤,一开始没有思路可以尝试通过这几步来开拓思维,之后可以总结自己的方法。