最短排序

原创 2016年08月28日 16:48:37

如题:
对于一个无序数组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;
    }

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

相关文章推荐

2017.4.3 机房测试 (并查集,最短路,拓扑排序,最小生成树)

jyb远在北京仍不忘为我们出题。 这次是喜闻乐见的图论专题。

待排序的最短子数组长度(C++版)

题目: 思路: 分别从 左->右:记录最大元素值 比较最大元素值和当前遍历元素的大小 如果 最大值 > 当前元素 记录当前元素下标, 直至数组遍历完成。  —— index1 和 右->左:记录最...

c2java 第6篇 图的表示,最短路,圈检测和拓扑排序

/* 图的表示 === 最简单的是临接矩阵了 int n = 10; int[][] adjMat = new int[n][n]; 如果边数接近顶点数的平方,就用这个很合适。 如果边比...

需要排序的最短子数组长度

题目: 给定一个无序数组,求出需要排序的最短子数组的长度。 例如:arr={1,5,3,4,2,6,7}返回4,因为只有[5,3,4,2]需要排序。 思路:  解决这个问题可以在时间复杂...
  • gjggj
  • gjggj
  • 2017年05月31日 15:30
  • 129

最短路模板(二)——用拓扑排序解决有向无环图中的最短路

测试数据: 8 13 5 4 0.35 4 7 0.37 5 7 0.28 5 1 0.32 4 0 0.38 0 2 0.26 3 7 0.39 1 3 0.29 7 2 0.34 6 2 0.40...

数据结构与算法分析笔记与总结(java实现)--排序12:最短子数组练习题

数据结构与算法分析笔记与总结(java实现)--排序12:最短子数组练习题

java 语言最短单元路径

  • 2012年05月14日 15:24
  • 3KB
  • 下载

用最短的时间学会使用Azkaban来管理我们的任务

学会使用Azkaban来管理我们的任务 Azkaban是什么:     Azkaban是由Linkedin公司推出的一个批量工作流任务调度器,用于在一个工作流内以一个特定的顺序运行一组工作和流...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最短排序
举报原因:
原因补充:

(最多只允许输入30个字)