2024-10-08 16:46阅读: 6评论: 0推荐: 0

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 中国大陆许可协议进行许可。

posted @   505donkey  阅读(6)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起