2021-11-16:最长递增子序列的个数。给定一个未排序的整数数组,找到最长递增子序列的个数。注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。力扣673。
2021-11-16:最长递增子序列的个数。给定一个未排序的整数数组,找到最长递增子序列的个数。注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。力扣673。
答案2021-11-16:
我的思路是:1.另外开辟一个等长度的数组lens存递增子序列长度和一个等长度的数组cnts存个数。2.遍历lens,找到最大值的序号。3.根据序号找cnts里的值并且求和,获取最大值的个数,这个值就是需要的返回值。
时间复杂度:O(N**2)。可优化成O(N*logN)。
额外空间复杂度:O(N)。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
arr := []int{1, 3, 5, 4, 7}
ret := findNumberOfLIS1(arr)
fmt.Println(ret)
}
// 好理解的方法,时间复杂度O(N^2)
func findNumberOfLIS1(nums []int) int {
if len(nums) == 0 {
return 0
}
n := len(nums)
lens := make([]int, n)
cnts := make([]int, n)
lens[0] = 1
cnts[0] = 1
maxLen := 1
allCnt := 1
for i := 1; i < n; i++ {
preLen := 0
preCnt := 1
for j := 0; j < i; j++ {
if nums[j] >= nums[i] || preLen > lens[j] {
continue
}
if preLen < lens[j] {
preLen = lens[j]
preCnt = cnts[j]
} else {
preCnt += cnts[j]
}
}
lens[i] = preLen + 1
cnts[i] = preCnt
if maxLen < lens[i] {
maxLen = lens[i]
allCnt = cnts[i]
} else if maxLen == lens[i] {
allCnt += cnts[i]
}
}
return allCnt
}
执行结果如下:
公众号:福大大架构师每日一题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
2020-11-16 2020-11-16:手写代码:leetcode第406题。假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。