交換シーケンスを最小限にインクリメント

我々は、等しい長さ2つの整数ない空の配列AおよびBを有します

我々は、A [i]とB [i]がある要素を交換することができます。シーケンス内のこれら二つの要素のそれぞれが同じ位置にあるべきであることに留意されたいです。

アレイAのいくつかの要素の交換後およびBは、厳密に、ストリンジェントな条件のみ配列A [0] <A [1] <A [2] <... <A [A.length - 1]をインクリメント(増加すべきです)。

二つの配列への復帰を厳密スイッチング状態の最小数を増やす保持されるように、配列AおよびB所与。与えられた入力必ずしも有効であると仮定すると。

例:

入力:A = [1,3,5,4]、B = [1,2,3,7] 
出力:1 
説明:
交換A [3]、B [3]は、次のように二つの配列:
A = [ 1、3、5、7] 、B = [1、2、3、4] 
二つの配列が厳密に増加しています。

注意:

A、B 2つの配列の長さが常に等しく、かつ範囲の長さ[1 1000]れます。
A [i]は、B [I ] 区間である[0、2000]整数。

ベストな方法は、ポイント分析:この質問は少し難しく高価誘導容量の要件の分析のためです。
ただ、私たちは同様の戦略を使用してについてのすべての貪欲な思考、Aを経験していることがあり、それを起動し、[I - 1]> = A [i]はこの逆の順序は、我々はAになります[i]をし、B [i]の交換、それは試験例になり困惑

0 4 4 
0 1 6 8

場合> = A [i]は、I = 2、貪欲な戦略に従い、我々は、A [2]を交換する必要があり、B [2]、我々はAを交換した後、[3]が表示されていることが見出さ - 最初は、A [1 i]が成立しました逆の順序は、次いで、[3]、B [3]を交換するので、2つの取引所の合計そのする必要があります。この質問はニーズ我々はA、Bは厳密に増加しながら、A [1]、B [1]を実現することができる交換するだけで卵のタイプ1を、交換されます。したがって、この単純な貪欲な戦略は機能しません。

他人の実現の検索は、動的プログラミングへの道を見つけました。

swapVec [i]を表すI交換番目の要素、その結果、A [0、i]は、B [0、i]が最小スイッチング周波数と厳密に単調増加
keepVec [i]を表すi番目の要素が交換されていないので、そのA [0 、I]、B [0] 、厳密に単調な交換の最小数を増加させます。

質問は今、我々は状態遷移方程式を見つけるのですかです。

(1)A [i]が> A [iは、 - 1] && B [i]は> B [iは、 - 1]、 この場合には、インクリメント自体は、この必要性は、交換されていないA [i]とB [ i]は
		swapVec [i]は必須の交換A [i]は、B [I示し ] 次に、最初のi-1が位置交換を持って、i番目のスイッチング素子であると同時に保証増分で、= I] [swapVecそうしながら、交換を継続することができますswapVec [I - 1] +1し
		keepVec [I]は交換しないA [i]は、Bを表す[I ]、 即ち、I-1番目のスイッチング素子が必要とされない、keepVecのi番目の要素を交換することなく、[I] = keepVec [I - 1] 
(2)A [i]が> B [I場合 - 1] && B [i]は> A [I - 1]は、 このような状況のために、A [i]は、B [Iを交換する必要があります]インクリメンタル維持するために
		swapVecを[I]だけ現在位置を交換することで、位置の前swapVec次いで、交換することができない[I] = keepVec [I - 1] +1 
		keepVec [I]は、我々ができ、その後、現在の位置を切り替えていません即ちkeepVec同じ増分を達成するために、切り替え前の位置、[I] = swapVecは[I - 1] 
の2つの条件が真である場合に小さい値をとります。

 

{ソリューションクラス
パブリック:
    INT minSwap(ベクトル<整数>&A、ベクトル<整数>&B){ 
        int型numsSize a.size =(); 
        // swapVec [i]を表すi番目のスイッチング素子、その結果、A [0 、I]、B [0、 i]は、厳密に単調増加の最小スイッチング周波数
    	// keepVec [i]を表すi番目の要素がそのように[0、i]は、Bことは、交換されていない [0、i]は増加厳密に単調です交換の最小数。
        ベクター<整数> swapVec(numsSize、INT_MAX)、keepVec(numsSize、INT_MAX); 
        swapVec [0] = 1; //は、初期化
        keepVec [0] = 0; 
        のための(INTインデックス= 1;指数<numsSize;インデックス++) { 
            IF([インデックス]> [インデックス- 1] && B [インデックス]> B [索引- 1]){ 
                // i番目のスイッチング素子場合、最初のi - 1つの要素を交換しなければならない。もしi番目の要素を切り替えていない場合、最初のi - 1要素の交換はならない
                swapVec [インデックス] = swapVec [索引 - 1] + 1。
                keepVec [インデックス] = keepVec [索引- 1]; 
            }
            ( - && B [インデックス]> A [。索引- 1] A [インデックス]> B [1インデックス])IF { 
                // i番目のスイッチング素子場合、最初のi - 1つの要素を交換してはならない。もしi番目の要素は、最初のi次いで、切り替えされていない- 1つの要素を交換しなければならない
                (keepVec [索引- 1]、swapVec [インデックス] + 1)swapVec [インデックス] =分; 
                keepVec [インデックス] =分(keepVec [インデックス]、swapVec [索引- 1]); 
            } 
        } 
        戻り分(swapVec.back()、keepVec.back()); 
    } 
};

 

転載:https://blog.csdn.net/qq_41855420/article/details/90264842

 

おすすめ

転載: www.cnblogs.com/wuchanming/p/12237298.html