第二章 排序 || 第19节 最短子数组练习题

Posted ranjiewen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章 排序 || 第19节 最短子数组练习题相关的知识,希望对你有一定的参考价值。

题目


对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。

给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度。(原序列位置从0开始标号,若原序列有序,返回0)。保证A中元素均为正整数。
测试样例:

[1,4,6,5,9,10],6

返回:2

解析

  • C++版
class Subsequence {
public:
    int shortestSubsequence(vector<int> A, int n) {
        // write code here
        int start=0;
        int end=n-1;
        //最右边比max值小的数的下标
        //最左边比min大的数的下标 
        //测试用例:[1,2,10,1,8,9],6
        int max=A[0],min=A[n-1];//记录两边已经遍历过的极值
        for(int i=0;i<n;i++)
            if(A[i]<max)
                start=i;
            else
                max=(max>A[i])?max:A[i];
        for(int j=n-1;j>=0;j--)
            if(A[j]>min)
                end=j;
            else
                min=(min<A[j])?min:A[j];
        if(start<=end)
            return 0;
        else
            return start-end+1;
    }
};
  • 错误的思想:直接从左右两边逆序记录位置不对,需要找到全局极值
class Subsequence {
public:
    int shortestSubsequence(vector<int> A, int n) {
        // write code here
        int start=0;
        int end=n-1;
        for(int i=0;i<n-1;i++)
            if(A[i]>A[i+1])
            {
                start=i;
                break;
            }
        if(start==0&&A[n-2]<=A[n-1])
            return 0;
        for(int j=n-1;j>=start;j--)
        {
            if(A[j]<A[j-1])
            {
                end=j;
                break;
            }
        }
        int res=end-start+1;
        return res;
    }
};

测试用例:
[1,2,10,1,8,9],6

对应输出应该为:

5

你的输出为:

2

以上是关于第二章 排序 || 第19节 最短子数组练习题的主要内容,如果未能解决你的问题,请参考以下文章

《程序员代码面试指南》第八章 数组和矩阵问题 需要排序的最短子数组长度

[算法]需要排序的最短子数组长度

算法/编程练习:和至少为K的最短子数组

需要排序的最短子数组的长度——是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组

给定一个无序数组arr,求出需要排序的最短子数组长度。例如: arr = [1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序。

最短无序连续子数组--力扣