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);
}
}
总结
这道题没有要求是子序列,如果要求必须是子序列的话可能就要用到动态规划了,今天的分享就到这,欢迎大家一起刷题打卡。