给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱) 例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},长度为6。 输入:数组,数组长度 输出:输出该数组最长递增子序列的长度
时间: 2024-11-15 17:24:21 浏览: 0
最长递增子序列(LIS)问题是一个经典的动态规划问题 给定一个数组,我们要找到其中最长的严格递增子序列的长度
这个问题可以使用动态规划(Dynamic Programming)中的滑动窗口(Sliding Window)算法来解决。首先,创建两个变量,`end`记录当前找到的最长递增子序列的结尾位置,`length`存储最长递增子序列的长度。
初始化 `end = 0` 和 `length = 1`(因为第一个元素本身就是单个递增子序列)。接下来,遍历数组从索引1开始:
1. 检查 `arr[end] < arr[i]`,如果满足条件(即当前元素大于前一个子序列的最后一个元素),说明找到了一个新的递增子序列的起点,将 `end` 更新为 `i`,并将 `length` 加一。
2. 如果 `arr[end] >= arr[i]`,说明当前位置无法延长递增子序列,需要回溯到下一个可能的位置,这时更新 `end` 为 `i - 1`,并检查 `arr[end + 1]` 是否能继续增加,若能,则更新 `end`。
遍历结束后,`length` 就是所求的最长递增子序列的长度。
下面是一个伪代码示例:
```
function findLongestMonotonicSubsequence(arr):
length = 1
end = 0
for i in range(1, len(arr)):
if arr[end] < arr[i]:
length += 1
end = i
else:
while (end > 0 and arr[end] >= arr[i]):
end -= 1
end += 1
return length
```
阅读全文