《程序员代码面试指南》需要排序的最短子数组长度

题目:

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

例如:

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

 

解答:

初始化变量noMinIndex=-1,从右向左遍历,遍历的过程中记录右侧出现的数的最小值,记作min。假设当前数为arr[i],如果arr[i]>min,说明如果要整体有序,min值必然会移到arr[i]的左边。用noMinIndex记录最左边出现这种情况的位置。如果遍历完成后noMinIndex依然为-1,说明从右到左始终不升序,原数组本来就有序,直接返回0。

接下来从左到右遍历,遍历的过程中记录左侧出现的最大值,记作max。假设当前数为arr[i],如果arr[i]<max,说明如果排序,max值必然会挪到arr[i]的右边。用变量noMaxIndex记录最右边出现这种情况的位置。

遍历完成后,arr[noMinIndex...noMaxIndex]是真正需要排序的部分,返回它的长度即可。

public class GetMInLength {

    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[] arr = {1,5,3,4,2,6,7};

        System.out.println(getMinLength(arr));

    }

}

 

效果

 

参考资料:《程序员面试代码指南》左程云 著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值