题目要求:
分析:
这道题利用动态规划,假设dp[i]为最长上升序列的长度,那么它只与前一个状态的最长上升序列长度有关,则可以得到一个递推表达式为:
dp[i] = Math.max(dp[i], dp[j] + 1)
这里要注意的是边界情况:nums只为0的时候,它也是一个最长上升序列,返回值为1。
下面代码中注释掉的部分拿出来单独放在循环里判断,性能会好很多。
具体代码如下:
class Solution {
public int lengthOfLIS(int[] nums) {
if(nums == null || nums.length == 0)
return 0;
if(nums[0] == 0) {
return 1;
}
int[] dp = new int[nums.length];
int result = 0;
for(int i = 0; i < nums.length; i ++) {
int curr = nums[i];
for(int j = 0; j < i; j ++) {
if(nums[i] > nums[j]) {
dp[i] = Math.max(dp[j] + 1, dp[i]);
}
//result = Math.max(result, dp[i] + 1);
}
}
for(int i = 0; i < nums.length; i ++) {
result = Math.max(result, dp[i] + 1);
}
return result;
}
}