要注意记录个数,有的子序列的长度会重复,所以单独使用一个数组记录
比如 1,3,5,4,7
1,3,4,7和1,3,5,7都是以7结尾的,但是数量有两个
public int findNumberOfLIS(int[] nums) {
if (nums.length == 0 || nums.length == 1){
return nums.length;
}
int[] dp = new int[nums.length];
int[] count = new int[nums.length];
int max = 0;
dp[0] = 1;
// 可能有全部相同的数字,所以要提前预设数量都是1
Arrays.fill(count,1);
for (int i = 1; i < nums.length; i++){
dp[i] = 1;
for (int j = 0; j < i; j++){
if (nums[j] < nums[i]){
if (dp[j] >= dp[i]){
dp[i] = dp[j] + 1;
count[i] = count[j];
}else if (dp[j] + 1 == dp[i]){
count[i] += count[j];
}
}
}
max = Math.max(dp[i],max);
}
int n = 0;
for (int s = 0; s < nums.length; s++){
if (dp[s] == max){
n += count[s];
}
}
return n;
}
线段树的解法以后补充