夜间模式暗黑模式
字体
阴影
滤镜
圆角
主题色
面试题 16.16. 部分排序

题目:

给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。
示例:
输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
输出: [3,9]
提示:
0 <= len(array) <= 1000000
Related Topics

贪心
数组
双指针
排序
单调栈

解体思路:

需要对数组进行循环,找到m,n的对应的位置。

1.寻找m的位置 从结尾向开头找,找到每个值都小于后面值的最大位置。

2.寻找n的位置,从开头向结尾找,令m后面的所有的值都大于之前的值最大小位置。

3.返回 m,n的值。

代码:

public int[] subSort(int[] array) {
        //设置默认m,n的位置都为-1
        int left = -1;
        int right = -1;
        //设定一个最大值,和最小值,用来判断是否前面的值大于或者小于,到当前位置的最大值,或者最小值。
        int valueMax = Integer.MAX_VALUE;
        int valueMin = Integer.MIN_VALUE;
        int len = array.length;
        for (int i = 0; i < len; i++) {
            //找到最大值,并找到n的位置。
            //如果当前位置的数据小于迄今为止的最大值,则证明之前的数据无法进行排序。移动位置。
            if (array[i] < valueMin) {
                left = i;
            } else {
                valueMin = Math.max(array[i], valueMin);
            }

            //找到最小值,找到m的位置。
            //这里使用的双判断,同时移动m,n循环一次就可以得到结果。
            //如果当前位置的数据大于迄今为止的最小值,则证明之后的数据无法进行排序。移动位置。
            if (array[len - i - 1] > valueMax) {
                right = len - i - 1;
            } else {
                valueMax = Math.min(array[len - i - 1], valueMax);
            }

        }
        return new int[]{right, left};
}
暂无评论

发送评论 编辑评论


				
上一篇
下一篇