算法总结之 最长的可整合子数组长度

如果一个数组在排序之后,每相邻两个数差的绝对值都为1,则该数组为可整合数组

 

方法一(通俗的做法)

  考察每个子数组-------> 复制成新数组------> 新数组排序------>验证是否符合

代码:

 

package TT;

import java.util.Arrays;

public class test61 {
  
      public static int getLIL1(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++){
                  if(isIntegrated(arr,i,j)){
                        len=Math.max(len,j-i+1);
                  }
             }
         }
         return len;
      }
     
      public 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;
      }
      
      
      public static void main(String[] args){
          
          int[] arr = new int[7];
          arr[0]=5;
          arr[1]=5;
          arr[2]=3;
          arr[3]=2;
          arr[4]=6;
          arr[5]=4;
          arr[6]=3;
    
         int x = getLIL1(arr);
         System.out.println(x);
          
      }
       
}

 

 

改进的方法:

  加速验证过程,前方高能!!!!!-------------------------------------------》》》》》》》》》

  判断一个数组是否可是可整合,

              如果     max-min+1= 元素个数  即为:6-2+1=5  那么这个数组就是可整合数组

 

废话不说多说!

package TT;


import java.util.HashSet;



public class test61 {
  
   public static int getLIL2(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])){
                      break;
                  }
                  set.add(arr[j]);
                  max=Math.max(max, arr[j]);
                  min=Math.min(min, arr[j]);
                  
                  if ( max-min == j-i) {
                      len=Math.max(len, j-i+1);
                    
                }
                  
             }
             set.clear();
        }
       return len;
   }
    
    
    
    
    
   public static void main(String[] args){
       
       int[] arr = new int[7];
       arr[0]=5;
       arr[1]=5;
       arr[2]=3;
       arr[3]=2;
       arr[4]=6;
       arr[5]=4;
       arr[6]=3;
 
      int x = getLIL2(arr);
      System.out.println(x);
       
   } 
   
   
   
}

 

 其实重点在于:

   不重复的数组中 ,下表的值 i   和    j 之差  j-i   与最大值和最小值max 和 min 的差值 是有关系的 也有数目相关性

   用set集合获取到不重复的数组

   然后进行时刻的判断 更新最大值

 

       最内层for循环去做事情,用set去操作,做完了时候要清空一下set

       外层下次循环继续使用,同时下次使用时候要用 min max重新初始化 

        我们的核心是一直记录最大的长度,其他的是中间产物。

 

posted @ 2017-09-06 19:36  toov5  阅读(341)  评论(0编辑  收藏  举报