Likou978。最長の乱気流サブアレイ-C言語

トピック

最長の乱流サブアレイ
AのサブアレイA [i]、A [i + 1]、…、A [j]が次の条件を満たす場合、それを乱流サブアレイと呼びます。

若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。

つまり、サブアレイ内の隣接する要素の各ペア間で比較記号が反転する場合、サブアレイは乱流サブアレイです。Aの最大乱流サブアレイの長さを返します。

例1:

入力:[9,4,2,10,7,8,8,1,9]
出力:5
説明:(A [1]> A [2] <A [3]> A [4] <A [5 ])

例2:

入力:[4,8,12,16]
出力:2

例3:

入力:[100]
出力:1

促す:

1 <= A.length <= 40000
0 <= A [i] <= 10 ^ 9

問題解決

分析:
明らかに、ここには2つの状態があります。配列が上下するときに考慮する必要がある、2つの主要な状態と、等値のブレークポイント状態です

したがって、次の状況で長さをリセットする必要があります。

1.等しい
2.継続的に上昇する
3.継続的に下降する

データ構造アルゴリズムの設計で動的計画法を使用して実装することは難しくありません。
立ち上がり状態をu、立ち下がりをd、戻りカウントをcountに設定します。
要素が1つしかない場合でも、初期の長さは1なので、値1が割り当てられます。

int maxTurbulenceSize(int* arr, int arrSize) {
    
    
    int count = 1;
    int d = 1, u = 1;

次に、配列をトラバースします

for (int i = 1; i < arrSize; i++) {
    
    

    }

先に述べたように、上昇するためには下降と上昇を交互に繰り返す必要があり、同時に上昇または下降を継続して行ってからリセットする必要があります。
したがって、状態遷移は変数の割り当てと交換によって実現できます。初期値は等しく、値が下がると、最初の乱流サブ配列に1を加えたものとして使用されます。長さは2です、次回上昇する場合は、単語ベースに1を足して長さ3、だが上昇要素は変更されていません、だからそれはすべきですダウンカウントに基づいて1つ増やします、 あれは

if (arr[i - 1] < arr[i]) {
    
    
            u = d + 1;
        }

同様に、下降も上昇カウントから追加する必要があります

if (arr[i - 1] > arr[i]) {
    
    
            d = u + 1;
            }

状態遷移はまだ不可能です。継続的な寮や落下を制限できないため、最後の実行が== u = d + 1; ==必要だったため、上昇後に再び上昇して数を2にリセットする必要があります。次の実行またはそれ以上の連続時間で2に保つには、dが上昇するたびに再割り当てし、1にリセットする必要があります。

if (arr[i - 1] < arr[i]) {
    
    
            u = d + 1;
            d = 1;
        }

衰退についても同じことが言えます

if (arr[i - 1] > arr[i]) {
    
    
            d = u + 1;
            u = 1;
        }

継続的な増加と減少を除いて、同じことがあります。この場合、両方をリセットする必要があるため、次のロジックがあります。

else {
    
    
            d = 1;
            u = 1;
        }

これはまだ終わっていません。現時点で取得できるのはuとdです。これら2つをカウントカウントに変換する必要があるため、変換するたびに、2つの間の大きい方の値を最終的な乱流サブ配列の長さとして選択する必要があります。 。

        count = fmax(count, d);
        count = fmax(count, u);

完全なコードは、上記のロジックを組み合わせることで取得できます。

int maxTurbulenceSize(int* arr, int arrSize) {
    
    
    int count = 1;
    int d = 1, u = 1;
    for (int i = 1; i < arrSize; i++) {
    
    
        if (arr[i - 1] > arr[i]) {
    
    
            d = u + 1;
            u = 1;
        } else if (arr[i - 1] < arr[i]) {
    
    
            u = d + 1;
            d = 1;
        } else {
    
    
            d = 1;
            u = 1;
        }
        count = fmax(count, d);
        count = fmax(count, u);
    }
    return count;
}

次のプログラムで直接テストを実行できます。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int maxTurbulenceSize(int* arr, int arrSize);
int main()
{
    
    
    int arr[12]={
    
    9,4,2,10,7,8,8,1,9,19,323,11,};
    int a=maxTurbulenceSize(arr,12);
    printf("最长湍流数组大小为%d\n",a);

}

int maxTurbulenceSize(int* arr, int arrSize) {
    
    
    int count = 1;
    int d = 1, u = 1;
    for (int i = 1; i < arrSize; i++) {
    
    
        if (arr[i - 1] > arr[i]) {
    
    
            d = u + 1;
            u = 1;
        } else if (arr[i - 1] < arr[i]) {
    
    
            u = d + 1;
            d = 1;
        } else {
    
    
            d = 1;
            u = 1;
        }
        count = fmax(count, d);
        count = fmax(count, u);
    }
    return count;
}

ここに画像の説明を挿入いい加減にして!
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_44922487/article/details/113753520