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

import java.util.*;
//获得最长的可整合子数组的长度
public class GetMaxArrLen{
	
     //方法一:(对每个子数组排序得到是否是按照1递增判断)
	public static int GetMaxArrLen01(int[]arr)
	{
            if(arr==null)
            {
            	return 0;
            }
            int len=0;  //返回的可整合子数组的长度
            LinkedList <Integer>subArr=new LinkedList<Integer>();
            for(int i=0;i<arr.length;i++)
            {
            	 for(int j=i;j<arr.length;j++)
            	 {  
                    for(int k=i;k<=j;k++)
                     {
                          subArr.add(arr[k]);
                     }
            	 	if(IsAddOne(subArr))
            	 	{
            	 		 len=Math.max(len,j-i+1);
            	 	}
            	 }
            	 //清除一个子数组的数据
            	 subArr.clear();
            }
            return len;
	}

	//判断是否按照1递增
	public static boolean IsAddOne(LinkedList subArr)
	{
          int[]newArr=new int[subArr.size()];
          int i=0;
          while(subArr.size() != 0)
          {
               newArr[i]=(int)subArr.removeFirst();
               i++;
          }
          Arrays.sort(newArr); //对子数组进行排序
          for(int j=0;j<newArr.length-1;j++)
          {
          	  if(newArr[j]!=newArr[j+1]-1)
          	  {
          	  	return false;
          	  }
          }
          
          return true;
	}
	//方法二:(对每个子数组排序得到子数组个数是否为max-min+1判断)
	public static int GetMaxArrLen02(int[]arr)
	{
            if(arr==null)
            {
            	return 0;
            }
            int len=0;  //返回的可整合子数组的长度
            for(int i=0;i<arr.length;i++)
            {
                int max=Integer.MIN_VALUE;
                int min=Integer.MAX_VALUE;
                for(int j=i;j<arr.length;j++)
                {
                	 // int max=arr[i];
                	 // int min=arr[i];
                	 // for(int k=i+1;k<=j;k++)
                	 // {
                	 // 	 max=Math.max(max,arr[k]);
                	 // 	 min=Math.min(min,arr[k]);
                	 // }
                	
                    max=Math.max(max,arr[j]);
                    min=Math.min(min,arr[j]);
                	 if(max-min==j-i)
                	 {
                	 	len=Math.max(len,j-i+1);
                	 }
                      
                }
            }
            return len; 
	}
	public static void main(String[]args)
	{
		//System.out.println("Hello");
		int[]arr={5,5,3,2,6,4,3};
		System.out.println(GetMaxArrLen01(arr));
		System.out.println(GetMaxArrLen02(arr));

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值