加载中...
面试题 16.16-部分排序(Sub Sort LCCI)
发表于:2021-12-03 | 分类: 中等
字数统计: 229 | 阅读时长: 1分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/sub-sort-lcci

英文原文

Given an array of integers, write a method to find indices m and n such that if you sorted elements m through n, the entire array would be sorted. Minimize n - m (that is, find the smallest such sequence).

Return [m,n]. If there are no such m and n (e.g. the array is already sorted), return [-1, -1].

Example:

Input:  [1,2,4,7,10,11,7,12,6,7,16,18,19]
Output:  [3,9]

Note:

  • 0 <= len(array) <= 1000000

中文题目

给定一个整数数组,编写一个函数,找出索引mn,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的mn(例如整个数组是有序的),请返回[-1,-1]

示例:

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

提示:

  • 0 <= len(array) <= 1000000

通过代码

高赞题解

解题思路

默认升序(降序也只是改一点代码,不影响)

原理:如果左侧最大值大于中间的最小值,则一定会被中间序列包括;同理,如果右侧最小值大于中间的最大值,则一定会被中间序列包括。

一遍遍历 + 两个指针(两次扫描可一次遍历完成)

1、从前向后扫描数组,判断当前array[i]是否比max小,是则将last置为当前array下标i,否则更新max;

2、从后向前扫描数组,判断当前array[len - 1 - i]是否比min大,是则将first置位当前下标len - 1 - i,否则更新min;

3、返回{first, last}

代码

class Solution {
    public int[] subSort(int[] array) {
        if(array == null || array.length == 0) return new int[]{-1, -1};
        int last = -1, first = -1;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        int len = array.length;
        for(int i = 0; i < len; i++){
            if(array[i] < max){
                last = i;
            }else{
                max = Math.max(max, array[i]);
            }

            if(array[len - 1 - i] > min){
                first = len - 1 - i;
            }else{
                min = Math.min(min, array[len - 1 - i]);
            }
        }
        return new int[] {first, last};
    }
}

统计信息

通过次数 提交次数 AC比率
15940 34985 45.6%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
面试题 16.15-珠玑妙算(Master Mind LCCI)
下一篇:
面试题 16.17-连续数列(Contiguous Sequence LCCI)
本文目录
本文目录