最长的可整合子数组的长度
程序员文章站
2022-03-01 17:17:38
...
【题目】
先给出可整合数组的定义。如果一个数组在排序之后,每相邻两个数差的绝对值都为1,则该数组为可整合数组。
例如,[5,3,4,6,2]排序之后为[2,3,4,5,6],符合每相邻两个数差的绝对值都为1,所以则个数组为可整合数组。
给定一个整型数组arr,请返回其中最大可整合子数组的长度。例如[5,5,3,2,6,4,3]的最大可整合子数组为[5,3,2,6,4],所以返回5。
【代码】
public static void main(String[] args) {
int[] m={5,5,3,2,6,4,3};
System.out.println(getL(m));//5
System.out.println(getL2(m));//5
}
//最长的可整合子数组的长度
public static int getL2(int[] arr){
if(arr==null||arr.length==0){
return 0;
}
int len=0;
int max=0;
int min=0;
HashSet<Integer> set= new HashSet<Integer>();//判断重复
for(int i=0;i<arr.length;i++){
max=Integer.MIN_VALUE;
min=Integer.MAX_VALUE;
for(int j=i;j<arr.length;j++){
if(!set.contains(arr[j])){
set.add(arr[j]);
max=Math.max(max, arr[j]);
min=Math.min(min, arr[j]);
//新的检查方式:如果数组中没有重复元素,且max-min+1=元素个数,则可整合
if(max-min==j-i){
len=Math.max(len, j-i+1);
}
}
}
set.clear();
}
return len;
}
public static int getL(int[] arr){
if(arr==null||arr.length==0){
return 0;
}
int len=0;
for(int i=0;i<arr.length;i++){
for(int j=i;j<arr.length;j++){
//依次考察每一个子数组arr[i...j],0<=i<=j<=N-1
if(isIntegrated(arr,i,j)){
len=Math.max(len, j-i+1);
}
}
}
return len;
}
//组成有序新数组,验证是否符合可整合数组的定义
private static boolean isIntegrated(int[] arr, int left, int right) {
int[] newarr=Arrays.copyOfRange(arr, left, right+1);
Arrays.sort(newarr);
for(int i=1;i<newarr.length;i++){
if(newarr[i-1]!=newarr[i]-1){
return false;
}
}
return true;
}
上一篇: 最长的可整合子数组的长度
下一篇: 最长的可整合子数组的长度