leetcode-300 最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
实现:
func lengthOfLIS(nums []int) int {
// 获取nums长度
n := len(nums)
// 定义切片dp,用于存储不同长度下nums最长递增子序列长度
dp := make([]int, n)
// dp各个节点初始化为1,因为每个节点自身也是各个长度下的一个子串
for i := range dp {
dp[i] = 1
}
// 对于每个节点i,同时遍历i之前的j个节点,因为随着i的变化,对应的递增子串长度可能也在变化,所以也需要同步检查前j个节点
for i := 0; i < n; i++ {
for j := 0; j < i; j++ {
// 如果节点i比之前的j值大,表示节点i可以加入到最长递增子串末尾形成新的子串,此时i位置的最长递增子串长度,取dp[i]和dp[j]+1中的较大值,其中dp[j]+1表示在节点j位置下的最长子串长度加上当前节点
if nums[i] > nums[j] {
dp[i] = max(dp[i], dp[j]+1)
}
}
}
// 因为最长子串长度可能在nums中任意位置,所以还需重新遍历dp获取最大值
max_length := 1
for _, length := range dp {
if length > max_length {
max_length = length
}
}
// 返回给定nums最长子串长度
return max_length
}
// 辅助函数,取两整数中较大值
func max(a, b int) int {
if a >= b {
return a
}
return b
}
本文作者:505donkey
本文链接:https://www.cnblogs.com/505donkey/p/18451958
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步