673 最长递增子序列的个数-中等
题目:
给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。
注意 这个数列必须是 严格 递增的。
分析:
dp 表示递增子序列的长度。
cnt 表示以 nums[i] 结尾的长度为dp[i]的个数。
// date 2023/11/13
func findNumberOfLIS(nums []int) int {
n := len(nums)
dp := make([]int, n)
cnt := make([]int, n)
maxLen := 0
ans := 0
for i := 0; i < n; i++ {
dp[i] = 1
cnt[i] = 1
for j := 0; j < i; j++ {
if nums[i] > nums[j] {
if dp[j] + 1 > dp[i] {
dp[i] = dp[j] + 1
cnt[i] = cnt[j] // dp[i] 在更新,所以重置cnt[i]个数
} else if dp[j] + 1 == dp[i] {
cnt[i] += cnt[j] // 说明存在多个,累加
}
}
}
// 最终结果集,更新或累加
if dp[i] > maxLen {
maxLen = dp[i]
ans = cnt[i]
} else if dp[i] == maxLen {
ans += cnt[i]
}
}
return ans
}
最后更新于