[算法]需要排序的最短子数组长度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]需要排序的最短子数组长度相关的知识,希望对你有一定的参考价值。

题目:

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

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

思路:

解决这个问题可以在时间复杂度为O(N)、额外空间复杂度为O(1)完成。

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

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

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

程序:

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;
    }

以上是关于[算法]需要排序的最短子数组长度的主要内容,如果未能解决你的问题,请参考以下文章

需要排序的最短子数组的长度——是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组

排序练习题:最短子数组

第二章 排序 || 第19节 最短子数组练习题

给定一个无序数组arr,求出需要排序的最短子数组长度。例如: arr = [1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序。

862. 和至少为 K 的最短子数组

算法/编程练习:和至少为K的最短子数组