Longest Increasing Subsequence
题目链接:Longest Increasing Subsequence
思路:
- 最近刷题速度异常的慢,有点崩溃。。。
- 这道题目的难点在于,它的最长上升子序列不要求是连续的。
- 开始看到该题毫无头绪,错误思路有:将数组两边降序的部分进行切除,最后剩余的序列还是包含同样的问题,不连续的序列无法处理。
- 使用动态规划,正确思路是:定义一个dp[]数组,长度为nums.length,数组的每个元素存储从下标0到当前下标的最长上升子序列长度(该序列一定是包括当前元素在内的),dp[i+1] = max{该元素前面的所有元素中对应的dp[]值}+1,求法是遍历前面的所有元素寻找最大maxDP。
- 上面这句话,(该序列一定是包括当前元素在内的),如若不然,求得的dp[]对应的数据是错误的,因为实际上前面没有那么多的元素真正小于该元素,我们要找的是实际小于我且呈递增现象的最大长度。
public static int lengthOfLIS(int[] nums) {
if(nums==null||nums.length==0) {
return 0;
}else if(nums.length==1) {
return 1;
}
int[] dp = new int[nums.length];
dp[0] = 1;
int i=1,j=0,max = dp[0];
for(;i<nums.length;i++) {
int maxDP = 0;
for(j=0;j<=i;j++) {
if(nums[j]<nums[i]) {
//寻找小于当前元素且最大的dp
maxDP = Math.max(maxDP, dp[j]);
}
}
//最大的dp+1为当前dp
dp[i] = maxDP+1;
//max记录最终dp数组中的最大值返回
if(dp[i]>max) {
max = dp[i];
}
}
return max;
}