最短排序

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值