算法总结之 需要排序的最短子数长度

给定一个无序数组arr,求出需要排序的最短子数组长度

例如: arr=[1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序

 

介绍一种 左右遍历方法   左右夹击 确认长度

首先从 右往左遍历 记录最小值 如果arr[i] >最小值  那么 最小值的位置应该在arr[i]的左边

然后从 左往右遍历  类似的思想不在累述

 

package TT;

public class Test17 {

   public static int getMinLength(int[] arr){
       
       if(arr==null || arr.length<2){
           return 0;
       }
       int min = arr[arr.length-1];
       int noMinIndex = -1;   //记录位置
       for(int i= arr.length-2; i !=-1; i--){
           if(arr[i]>min){
               noMinIndex=i;
           }else {
            min=Math.min(min,arr[i]);
        }
       }
       if(noMinIndex == -1){
           return 0;
       }   
       int max=arr[0];
       int noMaxIndex=-1;
       for(int i =1; i!=arr.length; i++){
             if(arr[i]<max){
                 noMaxIndex=i;
             }else {
                max=Math.max(max,arr[i]);
            }
       }
    return noMaxIndex - noMinIndex +1;          
   }
   public static void main(String[] args){
       int[] a = new int[7];
      a[0]=1;
      a[1]=5;
      a[2]=3;
      a[3]=4;
      a[4]=2;
      a[5]=6;
      a[6]=7;      
      int c = getMinLength(a);      
      System.out.println(c);
   }
   
}

测试结果:

 

public class Test7 {
   public  static int  getNeedSortLen(int[] arr){
       int right = arr.length-1;
       int left = 0;
           while (left<=right && arr[left]<arr[left+1]){
               left++;
           }
           while (right >=0 && arr[right]>arr[right-1]){
               right--;
           }
       return right-left+1;
   }
    public static void main(String[] args) {
         int[] arr = {1,5,3,4,2,6,};
        System.out.println( getNeedSortLen(arr));
    }
}

 

posted @ 2017-08-26 17:09  toov5  阅读(162)  评论(0编辑  收藏  举报