[レビュー] 581。最短の順序付けられていない連続サブ配列-整数配列numsを指定すると、連続サブ配列を見つける必要があります。このサブ配列を昇順で並べ替えると、配列全体が昇順で並べ替えられます注文。質問の意味を満たす最短のサブ配列を見つけてください。

件名:581。最短の順序付けられていない連続サブアレイ

整数の配列numsを指定すると、連続したサブ配列を見つける必要があります。このサブ配列を昇順で並べ替えると、配列全体が昇順で並べ替えられます。

質問の意味を満たす最短のサブ配列を見つけて、その長さを出力してください。
ここに画像の説明を挿入します

回答:

ここに画像の説明を挿入します

int findUnsortedSubarray(int* nums, int numsSize)
{
    
    
    int i,j,min,max;//游标和定位
    int posi=0;
    int posj=numsSize-1;
    // 找到连续子数组的起始位置
    while(posj>posi && nums[posi]<=nums[posi+1])
        posi++;
    // 找到连续子数组的末尾位置
    while(posj>posi && nums[posj]>=nums[posj-1])
        posj--;
    // 此时数组已经有序
    if(posi==posj)
        return 0;
    // 找到连续子数组中最大最小值
    // 接下来的程序是为了防止数据相同的情况
    // 如:[1,3,2,2,2]
    // 直接终止程序,posi=1,posj=2,程序返回2
    // 但是应该输出4
    min=nums[posi];
    max=nums[posj];
    for(i=posi;i<=posj;i++)
    {
    
    
        if(nums[i]<min)
            min=nums[i];
        if(nums[i]>max)
            max=nums[i];
    }
    posi=0;
    posj=numsSize-1;
    // 找到连续子数组的边界值
    // 连续子数组的起始位置
    while(nums[posi]<=min)
        posi++;
    // 连续子数组的末尾位置
    while(nums[posj]>=max)
        posj--;
    return posj-posi+1;
}

おすすめ

転載: blog.csdn.net/m0_46613023/article/details/114001401