LeetCode 300. 最长递增子序列
题目描述
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
思路
动态规划
- 定义dp数组
dp[nums.length]
,全部初始化为1,因为默认的最长长度是1:Arrays.fill(dp,1)
; - 对dp数组的处理实际上就分为以下几步
I. 第一个for循环(i)遍历整个dp数组
II. 第二个for循环(j)统计nums
中,在nums[i]
前面有多少个数比nums[i]
大,如果出现了比nums[i]
大的数(nums[j]
),就去更新dp数组dp[i]=Math.max(dp[i],dp[j]+1)
,这个递推式的意思就是要么取当前dp[i]的最长长度,要么在dp[j]的基础上+1(长度+1,后面有能够构成子序列的)
动态规划
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
// dp数组的初始化
Arrays.fill(dp,1);
// dp数组的填充
int result = 0;
for (int i = 0; i < nums.length; i++){
for (int j = 0; j < i; j++){
if (nums[j] < nums[i]) dp[i] = Math.max(dp[i], dp[j]+1);
}
result = Math.max(result, dp[i]);
}
return result;
}
}