先简单说一下最长子串:
for(let i=0;i<nums.length;i++){
for(let j=0;j<i;j++){
if(nums[i] > nums[j]){
if(dp[j] + 1 > dp[i]){
dp[i] = dp[j] + 1
}
}
}
if(dp[i] > max) max = dp[i]
}
也就是说,在每个下标上,都标记当前最长子串的长度,如果下次再出现比这个下标更大的值,那么只需要在此下标上加一,就是下次更大数的最长子串长度
那么同理,可以再建一个数组,来记录每个下标的出现最长子串的个数
var findNumberOfLIS = function(nums) {
let counter = new Array(nums.length).fill(1);
let dp=new Array(nums.length).fill(1);
let max = 1;
for(let i=0;i<nums.length;i++){
for(let j=0;j<i;j++){
if(nums[i] > nums[j]){
if(dp[j] + 1 > dp[i]){
dp[i] = dp[j] + 1;
counter[i] = counter[j];
}
else if(dp[j] + 1 === dp[i]){
counter[i] += counter[j];
}
}
}
if(dp[i] > max) max = dp[i]
}
let result = 0;
for(let i=0;i<counter.length;i++){
if(dp[i] === max) result+=counter[i]
}
return result;
};
主要是理解 counter[i]和counter[j]的关系
if(dp[j] + 1 > dp[i]){ dp[i] = dp[j] + 1; counter[i] = counter[j]; } else if(dp[j] + 1 === dp[i]){ counter[i] += counter[j]; }
即,当在j处第一次出现新长串时,那么新的长串和之前的串出现次数一样多
如果重复出现同样的长传,那么只需要把counter[j]再次加到这个counter[i]的基础上
深坑就是对于这个记录个数的数组的理解
想了半宿,太坑了