300. 最长递增子序列

84 阅读1分钟

300. 最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

思路:dp

  1. 确定dp函数以及下标含义:dp[i]表示以i结尾的子序列的最大长度
  2. 确定dp方程:一个字有两个状态,删除、不删除。dp[i] = max(dp[i],dp[j] + 1)
  3. 初始化:dp[i]=1
  4. 遍历顺序:从前到后
// 一个字有两个状态,删除、不删除
// dp[i]表示以i结尾的子序列的最大长度
// dp[i] = max(dp[i],dp[j] + 1)
func lengthOfLIS(nums []int) int {
    n := len(nums)
    dp := make([]int,n)
    for i := range dp {
        dp[i] = 1
    }
    dp[0] = 1
    res := 1
    for i := 1; i < n; i++{
        for j := 0; j <= i; j++{
            if nums[i] > nums[j] {
                dp[i] = max(dp[i],dp[j] + 1)
            }
        }
        res = max(res,dp[i])
    }
   
    return res
}
func max(x, y int)int{
    if x > y{
        return x
    }
    return y
}