Poison

673. Number of Longest Increasing Subsequence

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
33
34
35
36
37
class Solution {
public int findNumberOfLIS(int[] nums) {
// 定义 f[i] 为以 nums[i] 结尾的最长递增子序列的长度
int[] f = new int[nums.length];
Arrays.fill(f, 1);

// 定义 g[i] 为以 nums[i] 结尾的最长递增子序列的个数
int[] g = new int[nums.length];
Arrays.fill(g, 1);

int maxLength = 1;
for (int i = 1; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
if (f[j] + 1 > f[i]) {
// 能形成一个更长的递增子序列
f[i] = f[j] + 1;
g[i] = g[j];
} else if (f[j] + 1 == f[i]) {
g[i] += g[j];
}
}
}

maxLength = Math.max(maxLength, f[i]);
}

// 注意长度最长的子序列可能以任意元素结尾
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (f[i] == maxLength) {
count += g[i];
}
}
return count;
}
}
Reference

673. Number of Longest Increasing Subsequence