首页 > 试题广场 >

游游的最长稳定子数组

[编程题]游游的最长稳定子数组
  • 热度指数:1800 时间限制: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] 满足稳定条件且长度最大。
import java.util.*;
import java.io.*;

// 简单题,常规双指针定窗移动,不定窗口长度统计
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(bf.readLine());
        int[] input = Arrays.stream(bf.readLine().split(" ")).mapToInt(
                          Integer::parseInt).toArray();
        int maxLen = 1;
        //存储可变滑窗结果的数组
        ArrayList<Integer> arr = new ArrayList<>();
        arr.add(0);//初始添加首元素
        //两两比较后面与前一个元素来判断后面元素是否要添加
        for (int l = 0, r = 1; r < n; r++) {
            if (Math.abs(input[r] - input[l]) <= 1) {
                arr.add(r);
                if (arr.size() > maxLen) {
                    maxLen = arr.size(); //统计最长稳定连续子串长度
                }
            } else {
                arr.clear();
                arr.add(input[r]);
            }
            l++;
        }
        System.out.println(maxLen);
    }
}

发表于 2025-08-29 11:49:38 回复(0)
有大佬成功解答了吗?为什么提交保存的时候测试样例第十道提示索引越界,样例参数也不给复制,没法复现啊
发表于 2023-07-13 23:50:28 回复(1)