[路飞]部分排序

92 阅读1分钟

记录 1 道算法题

部分排序

面试题 16.16. 部分排序 - 力扣(LeetCode) (leetcode-cn.com)


要求:提供一个数组,其中有一部分不是有序的,将这部分的起始下标和结束下标返回。如果数组是有序的或者是空的,返回 [-1, -1]。

比如:[1,2,4,7,10,11,7,12,6,7,16,18,19] 输出:[3,9]

采用两个指针从两头进行遍历。指针负责记录数组中的断层,也是就不是有序的那个时刻,还需要一个值保存遍历过的最大值和最小值。

当从左边开始遍历的时候,如果比最大值大,那么就更新最大值,说明此时数组是有序的。如果比最大值小则说明数组变得不是有序的。就要将右指针指向这个下标。因为遍历的时候一定会让最大值一直增大,但是一旦出现比最大值小的拐点,那么这个拐点就会是不是有序的区间的右边界。

左边界的计算同理,从右边开始遍历。

    function subSort(array) {
        // 初始化,默认是有序的
        let l = -1
        let r = -1
        // 根据比大比小设置初始值
        let min = Infinity
        let max = -Infinity
        // 从左边遍历
        for(let i = 0; i < array.length; i++) {
            if (array[i] > max) {
                // 更新最大值
                max = array[i]
            } else {
                // 如果不大,就不是有序的
                r = i
            }
        }
        
        for(let i = array.length - 1; i >= 0; i++) {
            if (array[i] < min) {
                // 更新最小值
                min = array[i]
            } else {
                // 如果不小就不是有序的
                l = i
            }
        }
        
        return [l, r]
    }