最长的可整合子数组的长度

【题目】

先给出可整合数组的定义。如果一个数组在排序之后,每相邻两个数差的绝对值都为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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值