7-6 最长连续递增子序列 给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。C语言 输入格式: 输入第1行给出正整数n(≤10 5 );第2行给出n个整数,其间以空格分隔。 输出格式: 在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。 输入样例: 15 1 9 2 5 7 3 4 6 8 0 11 15 17 17 10 输出样例: 3 4 6 8
时间: 2025-03-30 08:06:06 浏览: 24
### 找到数组中最长连续递增子序列的C语言实现
要解决这个问题,可以通过一次线性扫描完成。核心思想是维护两个变量:`max_len` 表示当前发现的最长连续递增子序列的长度,`current_len` 表示正在统计的当前连续递增子序列的长度。
以下是完整的 C 语言代码实现:
```c
#include <stdio.h>
int findLengthOfLCIS(int* nums, int numsSize) {
if (numsSize == 0) return 0;
int max_len = 1; // 记录全局最长连续递增子序列长度
int current_len = 1; // 当前连续递增子序列长度
for (int i = 1; i < numsSize; ++i) {
if (nums[i] > nums[i - 1]) { // 如果当前元素大于上一个元素,则递增继续
current_len += 1;
} else { // 否则重置当前计数器
if (current_len > max_len) { // 更新最大值
max_len = current_len;
}
current_len = 1; // 重新开始计数
}
}
// 防止最后一个是更长的递增序列未被更新的情况
if (current_len > max_len) {
max_len = current_len;
}
return max_len;
}
void main() {
int nums[] = {1, 3, 5, 4, 7}; // 示例输入
int size = sizeof(nums) / sizeof(nums[0]);
printf("The length of the longest continuous increasing subsequence is %d\n", findLengthOfLCIS(nums, size));
}
```
#### 实现细节说明
上述代码通过单次遍历实现了 O(n) 时间复杂度和 O(1) 空间复杂度的效果[^1]。
- `for` 循环用于逐一遍历数组中的每一个元素。
- 使用条件判断 `if (nums[i] > nums[i - 1])` 来检测是否存在递增关系。
- 变量 `current_len` 负责实时跟踪当前递增子序列的长度,一旦遇到非递增情况即重置该变量并尝试更新全局最大值 `max_len`。
#### 输入输出处理
在实际应用中,可以根据需求调整输入方式。例如从标准输入读取数据或者接收外部参数传递的数据集。下面是一个简单的扩展版本支持动态输入的例子:
```c
#include <stdio.h>
#include <stdlib.h>
// 函数保持不变...
void main() {
int n;
printf("Enter number of elements: ");
scanf("%d", &n);
int *nums = malloc(sizeof(int) * n);
printf("Enter %d integers:\n", n);
for (int i = 0; i < n; ++i) {
scanf("%d", &nums[i]);
}
int result = findLengthOfLCIS(nums, n);
printf("The length of the longest continuous increasing subsequence is %d\n", result);
free(nums); // 清理分配内存
}
```
此版本允许用户手动指定数组大小及其内容,从而增强了程序灵活性。
---
###
阅读全文
相关推荐















