题目如下:
经过一个多月的leetcode刷题,虽然很多题还是刷不明白,但是有些套路还是能够想到,比如这道题。题目要求求最长上升子序列。我一开始将题意看错了,题目要求的是最长上升子序列,我理解成立求最长连续上升子序列,还用到了双指针法,可是一直通过不了,后来仔细将我的输出结果和目标结果进行对比,才发现,原来题目所说的子序列并不要求序列得连续。
然后只好想其他方法了,看到最长让我想到了动态规划,动态规划的难点在于找到状态转移方程,可能还是我对动态规划理解的不到位吧,一时间还是想不到。然后就看了题解
这是力扣上的官方题解,看完这个官方题解我还是不太理解,我不太理解主要还是把关注点完全放在了dp状态转移数组上了,我只是单独的看状态转移数组了,而这个题还得联系原始数组来看,因为题目要求是上升子序列,所以进行状态转移之前得先遍历0到当前i,将他们作比较,如果当前num[i]大于遍历过程中的数,则取dp[i]=max(dp[j])+1。
终于还是理解了,那么就动手些咯:
public int lengthOfLIS(int[] nums) {
if(nums.length==0) return 0;
int[] dp = new int[nums.length];
dp[0] = 1;
int max = 1;
for(int i=1;i<nums.length;i++){
int maxval =0;
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
if(maxval<dp[j]){
maxval = dp[j];
}
}
dp[i]=maxval+1;
if(max<dp[i])
max = dp[i];
}
}
return max;
}