美文网首页
部分排序

部分排序

作者: 水中的蓝天 | 来源:发表于2022-07-14 11:56 被阅读0次

部分排序

给定一个整数数组,编写一个函数,找出索引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

思路:设三个指针:左边、右边、扫描 ,遵照有序数组的规律,找到左侧最大值和左侧逆序对,一直向右扫描 最终得到最右逆序对;反过来从右向左扫描得到最左逆序对;这两个逆序对中间的范围就是所求答案


时间复杂度:O(n)
空间复杂度:O(1)


class Solution {

    public int[] subSort(int[] array) {
        
        //隐含条件:示例给出的数组大体上可以看出是从小到大排列

        //0. 边界判断
        if(array==null) return array;
        if(array.length==0||array.length==1) return new int[]{-1,-1};

        //1.从左到右扫描 寻找逆序对(正序:从小到大)
        int max = array[0];//先假设第一个就是左侧最大值
        int r = -1;//最右逆序对
        for(int i = 1;i<array.length;i++) {
            int val = array[i];
            if(val < max) {//说明是逆序对 记录下来
                r = i;
            }else {//>=更新最大值
                max = val;
            }
        }

        //2.扫描一遍没有发现逆序对 说明整个数组本来就有序
        if(r==-1) return new int[]{-1,-1};

        //3.从右往左扫描 寻找逆序对(正序:从大到小)
        int min = array[array.length-1];//右侧最小值
        int l = -1;//最左逆序对
        for(int i = array.length-1;i>=0;i--) {
            int val  = array[i];
            if(val <= min) { //遇到比min更小就更新min
                min = val;
            }else {// > 说明是逆序对 记录下来
              l = i;
            }
        }

        //4.返回结果
        return new int[]{l,r};

    }
}

相关文章

  • 6、排序算法

    选择排序、冒泡排序、插入排序三种排序算法可以总结为如下:都将数组分为已排序部分和未排序部分。 选择排序将已排序部分...

  • 对于基础排序算法的简要总结

    本文主要分析排序算法中的选择排序、插入排序、希尔排序、归并排序、快速排序和堆排序,以及其部分优化方式,部分代码示例...

  • Javascript基础算法排序

    代码部分 快速排序 冒泡排序 //选择排序

  • 算法解析之冒泡排序

    算法思路:1、序列分为未排序部分和已排序部分,初始状态为全部未排序2、扫描未排序部分,调整相邻元素的顺序,使未排序...

  • 面试基础算法复习

    排序算法 选择排序、冒泡排序、插入排序三种排序算法可以总结为如下:都将数组分为已排序部分和未排序部分。选择排序将已...

  • 数据结构之选择排序

    思路 将待排序的数分为两部分,一部分是已排序,另一部分是未排序。 将未排序部分中最小的数放在已排序部分后。 过程 代码

  • 算法解析之选择排序

    算法思路:1、整个序列分为待排序部分和已排序部分2、遍历待排序部分找到最小值,与待排序部分的第一个值交换3、重复2...

  • 插入排序

    思想:分成未排序和已排序两个部分, 从未排序的部分取出一个元素, 将这个元素和已排序的部分数据做对比, 找到插入位...

  • 部分排序

    部分排序[https://leetcode.cn/problems/sub-sort-lcci/] 给定一个整数数...

  • 基本排序算法 - 快速排序

    快速排序基本思想 快速排序是冒泡排序的改进。它通过一轮排序将要排序的数据分为独立的两部分,其中一部分都比另外一部分...

网友评论

      本文标题:部分排序

      本文链接:https://www.haomeiwen.com/subject/oustirtx.html