最短排序

来源:互联网 发布:源码与公众号 编辑:程序博客网 时间:2024/05/16 16:10

如题:
对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。
给定一个整数数组A及它的大小n,请返回最短子数组的长度。
测试样例:[1,5,3,4,2,6,7],7
返回:4
这一题,我开始想的是先进行排序,然后再和排好序的数组一一对应进行比较,这样找到最短需要排序的最短子数组,今天看了后边其他网友在牛客网上写的算法,真是太赞了,现在记录如下:
两次循环,第一次,先找到当前以扫描过的元素中的最大值,判断下一个元素是否小于这个最大值,若小于,则记录该为排序元素的下标,若大于,则更新最大值。(做一次判断,若没有记录下标,则说明数组有序,返回零。)
第二次循环,从后往前,找到已扫描过的元素中最小的元素,判断它的下一个元素是否小于最小元素,若大于,则记录元素下标,若小于,则更新最小值。
这样,就找到了两个下标,分别表示前边排好序元素的下一个元素和后边排好序元素的前一个元素,后边的下标减去前边的下标+1就是要排序的最短子数组长度。
记录huangjunm同学的代码如下:

int findShortest(vector<int> A, int n) {        // write code here        int k = -1;        int max = A[0];        for(int i=1;i<n;i++){            if(max > A[i])                k = i;            else                max = A[i];        }        if(k==-1)return 0;        int m = -1;        int min = A[n-1];        for(int i=n-2;i>=0;i--){            if(min < A[i])                m = i;            else                min = A[i];        }        return k-m+1;    }

若有不对之处,敬请指正。

0 0
原创粉丝点击