动态规划系列(四):LeetCode 300. Longest Increasing Subsequence(最长递增子序列)

题目描述:

  • 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

  • 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入: nums = [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入: nums = [0,1,0,3,2,3]
输出: 4

示例 3:

输入: nums = [7,7,7,7,7,7,7]
输出: 1

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

题解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* @Author AlanKeene
* @Date 2022/05/07
* @Points DP
*/
class Solution {
public int lengthOfLIS(int[] nums) {
// step 1: 初始化数组
int n = nums.length;
int[] dp = new int[n];

// step 2: 初始值
dp[0] = 1;
int maxLength = 1;

// step 3: 计算顺序:从左到右
for (int i = 1; i < n; ++i) {
// 默认值
dp[i] = 1;
// step 4: 状态转移方程
// dp[i] = max(dp[j]) + 1 AND 0 <= j < i && nums[i] > nums[j]
for (int j = 0; j < i; ++j) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[j] + 1, dp[i]);
}
}
maxLength = Math.max(dp[i], maxLength);
}

return maxLength;
}
}

你的赞赏将是我创作输出的最大动力
0%