呜呜呜,这么多天了,刷了这么多天的DP了,我自己终于不看解析做出一道DP题了,给自己感动坏了。
要查找最长上升子序列,
我们可以把最长的的子序列长度放在dp[i]里面,
每次用当前下标的可以的最长子序列跟之前下标的最长子序列下标进行比较即可。
package LeetCode.OneToFiveHundred;
public class ThreeHundred {
public int lengthOfLIS(int[] nums) {
//边界处理
int len = nums.length;
if (len == 0) return 0;
int [] dp = new int[len];
dp[0] = 1;
int max = 1;//最小为1
//将最长长度始终放在dp[i],用maxVal标记当i下标时最长的上升序列
for (int i = 0; i < len; i ++){
int maxVal = 0;
for (int j = i; j >= 0; j--) {
if (nums[j] < nums[i])
//计算下标为i时最大的值
maxVal = Math.max(maxVal, dp[j]);
}
//若最大长度发生变化,则当下标为i时,最长子序列要加一,若不变maxVal值仍为0,最长子序列仍为1
dp[i] = maxVal + 1;
//取最大值
max = Math.max(dp[i], max);
}
return max;
}
}
题目:
300. 最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。