给定一个无序的整数数组,找出其中最长上升子序列的长度。
解题思路:
-
状态定义:
dp[i]表示截至nums的第i个元素时的最长上升子序列的长度。 -
转移方程:设j∈[0,i),考虑每一轮计算dp[i]时,遍历[0,i)区间,做以下判断:
1.当nums[i]>nums[j],此时nums[i]可以置于nums[j]之后,此时最长上升子序列的长度为dp[j]+1;
2.当nums[i]<nums[j],此时nums[i]无法置于nums[j]之后,无法组成上升序列,因此直接跳过;
3.情况1里计算出的dp[j]+1的最大值,为直到第i个元素的nums的最长上升子序列;
4.转移方程:dp[i]=max(dp[i],dp[j]+1) -
初始状态:
dp[i]所有元素置为1,表示每个元素可以自成一个长度为1的子序列; -
返回dp数组中的最大值,即为结果。
-
复杂度分析:
时间复杂度:O(N^2)
空间复杂度:O(N),需要一个dp列表。
public int lengthOfLIS(int[] nums) {
if (nums.length == 0) {
return 0;
}
int[] dp = new int[nums.length];
int res = 0;
Arrays.fill(dp, 1);
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);
}
}
res = Math.max(res,dp[i]);
}
return res;
}