首页 > 试题广场 >

游游的最长稳定子数组

[编程题]游游的最长稳定子数组
  • 热度指数:1788 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}定义一个数组被称为稳定,当且仅当对于数组中任意相邻元素 a_i,a_{i+1},都有 |a_{i+1}-a_i|\leqq 1
\hspace{15pt}给定长度为 n 的整数数组 a,请你求出其最长稳定连续子数组的长度。

输入描述:
\hspace{15pt}第一行输入一个整数 n\left(1\leqq n\leqq 10^{5}\right)——数组长度。 
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots ,a_n\left(1\leqq a_i\leqq 10^{9}\right)——数组元素。


输出描述:
\hspace{15pt}输出一个整数,表示最长稳定连续子数组的长度。
示例1

输入

5
2 4 2 3 2

输出

3

说明

子数组 [2,3,2] 满足稳定条件且长度最大。
#include <stdio.h>
#include <stdlib.h>
//双指针的时间复杂度基本都是O(n)吧,多往这方面想就行
//确实可以用双指针,一个指针指向子数组头部,一个指向尾部,当这个尾部指针找不到符合位置时就跳过这个数组去找下一个子数组即可。

int main() {
    int n;
    scanf("%d",&n);
    int array[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&array[i]);
    }

    int max_length=1;//初始化最长子数组长度
    int a=0,b=a+1;
    int temp_length=1; //记录临时的子数组长度
    while (b<n) {
       
        if (abs(array[b]-array[b-1])<=1) {   //小于则符合
            temp_length++; //长度加1
            b++;  //b移动到下一个位置
            if (temp_length>max_length) {  //记录最大长度
                max_length=temp_length;
            }
        }else {  //不符合则跳到下一个子数组重新找
            a=b;
            b=a+1;
            temp_length=1;
        }

       
    }

    printf("%d",max_length);
    return 0;
}
发表于 2025-10-19 14:48:49 回复(0)