📅  最后修改于: 2023-12-03 15:14:25.879000             🧑  作者: Mango
编写一个程序,从一个包含n(n<=1000)个整数的数组arr[]中找出包含连续整数的最长子序列,并输出该子序列的长度。
子序列定义为数组元素在一定的顺序下可以不连续的选择部分元素得到的序列,但是子序列中的元素必须按照原数组顺序排列。
例如:
arr[ ]={3,5,2,8,9,7,1,6,4} 中,最长的连续整数子序列为2 3 4 5 6,长度为5,因此程序输出为5。
题目要求从数组中找出最长的连续整数子序列,我们可以先对数组排序,然后遍历数组,统计最长子序列的长度。
在遍历数组时,我们设置两个指针,一个指向当前最长子序列的开头,一个指向当前位置,如果当前位置与前一个位置相邻,则更新当前最长子序列的结尾,并更新最长子序列的长度,若不相邻则重新开始计数。
排序可以使用C语言标准库函数qsort()实现,其参数为数组首地址、元素数量、元素大小和比较函数。
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int *) a - *(int *) b;
}
int longestConsecutiveSubarray(int arr[], int n) {
qsort(arr, n, sizeof(int), cmp);
int maxLen = 1, len = 1;
int i, pre = arr[0];
for (i = 1; i < n; i++) {
if (arr[i] == pre + 1) {
len++;
} else if (arr[i] == pre) {
continue;
} else {
if (len > maxLen) {
maxLen = len;
}
len = 1;
}
pre = arr[i];
}
if (len > maxLen) {
maxLen = len;
}
return maxLen;
}
int main() {
int arr[] = {3, 5, 2, 8, 9, 7, 1, 6, 4};
int n = sizeof(arr) / sizeof(arr[0]);
int len = longestConsecutiveSubarray(arr, n);
printf("%d\n", len);
return 0;
}
输入:
{3, 5, 2, 8, 9, 7, 1, 6, 4}
输出:
5
该算法的时间复杂度为O(nlogn),其中n为数组元素个数,主要消耗时间的是排序。
该算法的空间复杂度为O(1),只使用了有限个变量来存储结果和计算过程中的临时数据。