最长连续递增序列
字数 1082 2025-11-16 12:49:44
最长连续递增序列
题目描述:
给定一个无序的整数数组nums,请找出其中最长的连续递增子序列的长度。连续递增子序列是指从原数组中选取连续的一段,且这段元素严格递增(每个元素都比前一个元素大)。
解题过程:
- 问题分析:
- 我们需要找到数组中连续的一段,这段元素是严格递增的
- 子序列必须是连续的,不能跳过任何元素
- 要求返回最长这样的连续子序列的长度
-
状态定义:
定义dp[i]表示以第i个元素结尾的最长连续递增子序列的长度。 -
状态转移方程:
- 如果nums[i] > nums[i-1],说明当前元素可以接在以i-1结尾的连续递增子序列后面,形成更长的连续递增子序列:
dp[i] = dp[i-1] + 1 - 如果nums[i] <= nums[i-1],说明连续性被打破,需要重新开始计数:
dp[i] = 1
-
初始条件:
dp[0] = 1(第一个元素自身就是一个长度为1的连续递增子序列) -
算法步骤:
- 初始化dp数组,长度为n(数组长度),dp[0] = 1
- 初始化max_len = 1(记录全局最大值)
- 从i=1到n-1遍历数组:
- 如果nums[i] > nums[i-1]:dp[i] = dp[i-1] + 1
- 否则:dp[i] = 1
- 更新max_len = max(max_len, dp[i])
- 返回max_len
- 示例演示:
对于数组nums = [1,3,5,4,7]:
- i=0: dp[0] = 1, max_len = 1
- i=1: nums[1]=3 > nums[0]=1 → dp[1] = dp[0]+1 = 2, max_len = 2
- i=2: nums[2]=5 > nums[1]=3 → dp[2] = dp[1]+1 = 3, max_len = 3
- i=3: nums[3]=4 ≤ nums[2]=5 → dp[3] = 1, max_len = 3
- i=4: nums[4]=7 > nums[3]=4 → dp[4] = dp[3]+1 = 2, max_len = 3
最终结果为3(对应子序列[1,3,5])
- 优化:
实际上我们可以用单个变量代替dp数组,因为每个状态只依赖于前一个状态:
- 用curr_len记录当前连续递增序列长度
- 用max_len记录全局最大值
这样空间复杂度可以从O(n)降到O(1)
这个解法的时间复杂度是O(n),空间复杂度是O(1)(优化后),是解决此类问题的最优解。