【每日算法Day 62】最长递增子序列
Wallace Xu 2020-08-01 字符串动态规划
# LeetCode 300. 最长上升子序列 (opens new window)
# 题目描述
给定一个无序的整数数组,找到其中最长上升子序列的长度。
# 示例
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
1
2
3
2
3
# 解题思路
这是一维数组,我们使用dp[i]来表示以第i个元素结尾的最长上升子序列长度。那么只需要从dp[i]开始往左扫描,遇到所有比arr[i]小的元素就获取其长度,加一后填入到当前dp[i]中,如果找到arr[0]都没有找到更小元素,则将dp[i]赋值为1,表示该元素是序列的第一个元素。
public int lengthOfLIS(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int n = nums.length;
int[] dp = new int[n];
for (int i = 0; i < n; i++) {
for (int j = i-1; j >=0 ; j--) {
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
if (dp[i] == 0)
dp[i] = 1;
}
int max = 0;
for (int i = 0; i < n; i++) {
max = Math.max(max, dp[i]);
}
return max;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20