刷题打卡第五天——最长不相邻序列

154 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述:

给你一个整数数组,要求数组中最长的不相邻序列。最长不相邻序列是指数组中任意两个数相差绝对值小于大于1。比如给你数组[1,4,5,6,7,7,4,2],最长不相邻序列就是[1,4,6,7]。

输入示例:

1

1 4 5 6 7 7 4 2

输出示例:

4

输入描述:

第一行输入一个整数,代表数组长度

第二行输入数组元素,使用空格分隔

输出描述:

输出最大不相邻序列长度

二、思路分析:

这题是一道比较简单的题,但是很多人可能想得太复杂了,使用动态规划什么的,可能是我比较菜,我分析了一下题目,只要选出来的序列各个数之间相差大于1即可,那么我就可以先排序,排序后从最小的数开始遍历,使用双指针,如果先指针的值与后指针的值差大于1,计算就加1,通过一遍遍历就可以得到最大的不相邻序列长度。

主要就是双指针:前指针是要判断的数,后指针是前一个符合的数,因为是升序的,所以直接比较前一个即可,如果相差大于1,后指针再移动到前指针处。

三、AC 代码:


import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i]=sc.nextInt();
        }
        //排序
        Arrays.sort(arr);

        if(n<=1) {
            System.out.println(n);
            return;
        }
        int ans=1;
        int j=0;
        for (int i = 1; i < arr.length; ) {
            if(arr[i]-arr[j]>1){
                ans++;
                j=i;
            }else {
                i++;
            }
        }
        System.out.println(ans);
    }

}

总结

这道题没有要求是子序列,如果要求必须是子序列的话可能就要用到动态规划了,今天的分享就到这,欢迎大家一起刷题打卡。