输入一串序列找出最长的连续序列,C语言
时间: 2024-10-20 14:01:11 浏览: 33
OJ_在字符串中找出连续最长的数字串
在C语言中,找到一个给定整数序列中最长的连续递增子序列可以使用动态规划的方法。这里有一个常见的算法叫做“滑动窗口”或者“Kadane’s Algorithm”。以下是基本步骤:
1. 定义两个变量:`max_current` 用于存储当前子序列的最大值,`max_global` 用于存储已知的最大连续序列长度。
2. 遍历输入数组 `arr[]`,初始化 `max_current` 和 `max_global` 为第一个元素。
3. 使用两个指针 `left` 和 `right` 分别指向子序列的开始和结束。初始时,`left = right = 0`。
4. 当 `right < n - 1` 时(n 是数组长度),执行以下操作:
a. 如果 `arr[right + 1]` 比 `arr[right]` 大,说明序列递增,将 `right` 向右移动并更新 `max_current`。
b. 否则,`arr[right + 1]` 可能不是子序列的一部分,所以尝试更新 `max_global`,如果 `max_current + 1 > max_global`,就更新 `max_global` 为 `max_current + 1`,并将 `left` 移到 `right + 1`。
5. 重复步骤4,直到 `right = n - 1`。
6. 最后,`max_global` 就是整个序列中最长的连续递增子序列的长度。
下面是一个简单的C语言函数实现这个算法:
```c
#include <stdio.h>
int longestIncreasingSubsequence(int arr[], int n) {
if (n == 0) return 0;
int max_current = arr[0], max_global = arr[0];
int left = 0, right = 1;
while (right < n) {
if (arr[right] > arr[left]) {
max_current = arr[right];
++right;
} else {
max_current = arr[left];
if (max_current + 1 > max_global) {
max_global = max_current + 1;
}
++left;
}
}
return max_global;
}
// 示例
int main() {
int arr[] = {10, 9, 2, 5, 3, 7, 101, 18};
int n = sizeof(arr) / sizeof(arr[0]);
printf("最长递增子序列的长度是 %d\n", longestIncreasingSubsequence(arr, n));
return 0;
}
```
阅读全文