题解 | #需要排序的最短子数组长度#

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

http://www.nowcoder.com/practice/fccb5d14b44b4b99b34839bdf20588e9

具体思路看注释

从左往右找最后一个不满足递增序列的位置

从右往左找最后一个不满足递增序列的位置

为什么不找第一个不满足递增序列的位置呢?

156378
从左往右第一个不满足递增位置的为3,但是明显需要排序的第一个位置为5
从右往左第一个不满足递增的位置为6,但是明显需要排序的第一个位置为3

从左往右最后一个不满足递增序列的位置为3
从右往左最后一个不满足递增序列的位置为5
因此最终返回的需要排序的最短子序列长度为3,5对应下标的差值+1

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int n;
    while (cin >> n)
    {
        vector<int> arr(n, 0);
        for (int i = 0; i < n; i++)
        {
            cin >> arr[i];
        }
        //从左到右记录当前最大数字
        //并左往右找最后一个不满足递增序列的下标
        int max = arr[0];
        int flagj = 0;
        for (int j=1; j < n; j++)
        {
            if (arr[j] < max)
            {
                //记录当前不满足的下标值
                flagj=j;
            }
            else
            {
                //更新当前的最大值
                max = arr[j];
            }
        }
        //从右往左找最后一个不满足递增序列的下标
        int min = arr[n - 1];
        int flagi = 0;
        for ( int i = n - 2; i >= 0; i--)
        {
            if (arr[i] > min)
            {
                //记录当前的不满足的下标值
                flagi=i;
            }
            else
            {
                //更新当前的最小值
                min = arr[i];
            }
        }
        if (flagj >= flagi)
        {
            cout << flagj - flagi + 1 << endl;
        }
        else
        {
            cout << 0 << endl;
        }


    }
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务