相关标签
一、题目要求
二、题解和代码实现
1.题解
2.代码实现
代码如下(示例):
class Solution {
public int findNumberOfLIS(int[] nums) {
int len = nums.length;
if(len <2){return len;}
int[] dp = new int[len];
int res=0;//最终返回最长递增子序列的个数
int maxCount=0;
int[] counts = new int[len];
for (int i = 0; i < dp.length; i++) {
dp[i] = 1;//初始化每个当前长度为1
counts[i] = 1;//初始化每个当前最长递增子序列的个数
}
for (int i = 0; i < nums.length; i++) {//遍历
for (int j = 0; j < i; j++) {//遍历 i之前的元素和i比较
if (nums[i] >nums[j]){//当i下标元素大于j下标元素时
if (dp[j]+1 >dp[i]){// 当dp[j] + 1 > dp[i],说明找到了一个更长的递增子序列。
//那么以j为结尾的子串的最长递增子序列的个数,就是最新的以i为结尾的子串的最长递增子序列的个数
counts[i]= counts[j];
}else if (dp[j]+1 ==dp[i]){//当dp[j] + 1 == dp[i],说明找到了两个相同长度的递增子序列。
//那么以i为结尾的子串的最长递增子序列的个数 就应该加上以j为结尾的子串的最长递增子序列的个数
counts[i]+=counts[j];
}
dp[i] = Math.max(dp[i],dp[j]+1);//找出当前dp[j]+1 和dp[i] 两个长度中较大那个进行赋值,
// 这样可以找出到dp[i]的最长递增子序列的长度
}
if (dp[i] > maxCount){ // 记录最长长度
maxCount = dp[i];
}
}
}
for (int i = 0; i < dp.length; i++) {//遍历
if (dp[i]==maxCount){//判断dp[i]和最长长度相同,说明i下标下的counts[i]的值就是最长递增子序列的个数,可能有多个所以+=
res+=counts[i];
}
}
return res;
}
}