📜  C测验– 107 |问题2(1)

📅  最后修改于: 2023-12-03 15:14:25.879000             🧑  作者: Mango

C测验-107 | 问题2

题目描述:

编写一个程序,从一个包含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),只使用了有限个变量来存储结果和计算过程中的临时数据。