93 数组中的最长连续子序列
Table of Contents

ac

给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)

常规思路: 先排个序,去重数据,然后有序数组求连续的数字的最长即可

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static Scanner sc = new Scanner(System.in);

    public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        // 排序,有重复数字可以剔除掉
        Arrays.sort(arr);

        int[] arrUniq = new int[n];
        arrUniq[0] = arr[0];
        int arrUniqIndex = 0;
        for(int i=1;i<n;i++){
            if(arr[i] != arrUniq[arrUniqIndex]){
                arrUniq[++arrUniqIndex] = arr[i];
            }else {
                continue;
            }
        }
        // 遍历一遍求解即可
        int ans = 1;
        int curCnt = 1;
        int lastVal = arrUniq[0];
        for(int i=1;i<=arrUniqIndex;i++){
            if(arrUniq[i] == lastVal + 1){
                curCnt ++;
                lastVal ++;
                ans = Math.max(ans, curCnt);
            }else {
                lastVal = arrUniq[i];  
                curCnt = 1;
            }
        }
        System.out.println(ans);
    }

}
/*
6
100 4 200 1 3 2

4

3
1 1 1

1

时间复杂度O(nlogn),空间复杂度O(n)

8
100 4 200 1 3 2 200 4
 */