余談:
この質問はのことを思い出します
課題は、+ B + C + D =ターゲットのように、番号を再利用することができ、宝くじコンテストプログラミングの問題を抱えています。
+ B =ターゲットCDに+ B + C + D =ターゲット。唯一存在するか否かを判定した場合、それはすべてのC + Dの値は、その後binary_searchを得るために前処理することができる(標的-AB)
治療
アレイのn個の数の合計で、INT(株)のアレイを準備
KK [C * N + D] = K [C] + K [D]。
Oの複雑さ(N ^ 2log(N))
この質問は次のようになります。
そして、ほとんどの最初の二つの質問、最初の固定された2つの数字、そして二重の指に
クラス解決{ パブリック: ベクトル <ベクトル< INT >> fourSum(ベクトル< INT >&NUMS、int型のターゲット){ ベクトル <ベクトル< INT >> RET。 もし(nums.empty()) リターンRET; INT LEN = nums.size()。 もし(LEN < 4 ) リターンRET。 ソート(nums.begin()、nums.end()); 以下のために(int型 i = 0 ; iは<LEN - 3 ; iは++ ){ もし(I> 0 && NUMS [I] == NUMS [iが- 1 ]) 続けます。 以下のために(int型 J = I + 1、J <len- 2 ; J ++ ){ 場合(NUMS [J] == NUMS [J- 1 ] &&(jは> I + 1 )) 続けます。 int型 L = J + 1 。 INT R = LEN - 1 。 一方、(L <R){ // 多组 INT S = NUMS [I] + NUMS [L] + NUMS [R] + NUMS [J]。 場合(S> ターゲット) R - 。 それ以外の 場合(S < ターゲット) L ++ ; 他{ ret.push_back({NUMS [i]は、NUMS [J]、NUMS [L]、NUMS [R]})。 一方、(L <R && NUMS [L] == NUMS [++ L])。 一方、(L <R && NUMS [R] == NUMS [ - R])。 } } } } 戻りRET。 } }。