这题主要是沿用了最长递增子序列的套路,主要是要在记录最长递增子序列的过程中也记录一份有子序列的数量,本题我用count数组来记录。需要注意的点是:
- 初始化条件,开始子序列只有nums[i]一个元素,故长度为1,数量就一个。
- 每次更新dp的条件是子数组大于当前子数组值。
int max = 1;
public int findNumberOfLIS(int[] nums) {
int len = nums.length;
int[] dp = new int[len];
int[] count = new int[len];
for (int i = 0; i < len; i++) {
//初始化条件,开始子序列只有nums[i]一个元素,故长度为1,数量就一个。
dp[i] = 1;
count[i] = 1;
for (int j = 0; j < i; j++) {
//满足递增子序列条件
if (nums[i] > nums[j]){
if (dp[i] < dp[j] + 1){//更新长度后查看是否需要更新最大长度
dp[i] = dp[j] + 1;
count[i] = 0;
}
if (dp[i] == dp[j] + 1){
count[i] += count[j];
}
}
}
max = Math.max(max,dp[i]);
}
int ans = 0;
for (int i = 0; i < len; i++) {
if (dp[i] == max){
ans += count[i];
}
}
return ans;
}