分析:これは、上の三角形を形成する能力の主題であります
三角形の構成条件:A + B> C(提供<= bの<= C、すなわちオーダリング)を加えて、A> 0 && B> 0 && C> 0(異常対象データが考慮されていないが存在しません)
したがって、対象が昇順で決定された直後の要求に応じて、[I] + [I + 1]> [I + 2]、プラス数1ダイレクトがある場合
[I] + [I理由を説明 + 1]> [I + 2]を決定することができる、[I] + [Iない場合がある + 1]> [I + 2]が成立しません。それの三角形があるのですか?
[I] +後の昇順配列がある場合の三つの条件が満たされた場合[I yを+]、(X> Y> = 2)、すなわち、乱数取得三角> [Iは、xを+]
だからがなければならない[i]が+が上昇されるので、より大きな添字数が大きいほど、添字iは、Y-1(+、> [iが+ Y] [iは、Y-1 +]> = I + X従って> [I + X]が、式は依然として有効である= [Iは、Y-1 +])
同様に[Iは、Y 2 +] >は、[I]を= ので[Iはy 2 +]が存在しなければならない + [iが+ Y-1]> [IはY +]、 すなわち、[I ] [I + 1] + > [I + 2] が存在しなければなりません。。
注意:タイトルは三角形がそう余分な作業をしない範囲にどのように多く得[L、R]を必要としません。
次のようにC ++のコードは次のとおりです。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONSTの INT MAXN =(INT)1E7 + 5 。 int型[MAXN]、N、M。 ベクトル < int型 > V。 INT メイン(){ ながら(〜のscanf(" %d個"、&N)){ ため(int型 i = 1 ; iが<= N; iが++)scanf関数を(" %のD "、および[I])。 scanf関数(" %のD "、&M)。 int型の CNT = 0; 一方(M-- ){ int型のL、R&LT; scanfの(" %のDの%のD "、&L&R&LT)、 IF(L-R&LTの+ 。1 > = 47)CNT ++; // 大きい間隔は一度容易であることから三角形を形成し、テストの境界のうち他 他 IF(L-R&LT + 。1 < 3は)続け、 そうでなければ{ v.clearを() のために(int型 = L Iを、I <= R&LT; I ++の)v.push_back([I] ); ソート(v.begin()、v.end()); INT LEN = v.size()。 ブールフラグ= 0 。 以下のために(int型 i = 0 ; iは<len- 2 ; I ++ ){ 場合(V [i]が+ V [I + 1 ]> V [I + 2 ]){ フラグ = 1 。 破ります; } } もし(フラグ)CNT ++ 。 } } のprintf(" %d個の\ n " 、CNT)。 } 戻り 0 。 }
TELL:
今すぐに構築することができますどのように多くの三角形の統計間隔の配列が必要です。これはleetcodeのトピックです:https://leetcode-cn.com/problems/valid-triangle-number/?utm_source=LCUS&utm_medium=ip_redirect_q_uns&utm_campaign=transfer2china
次のようにC ++のコードは次のとおりです。
クラスソリューション{ // タイトル思想:それぞれ、Cを固定し、その後、左周りの変数cの摺動 公共: INT triangleNumber(ベクトル< INT >&NUMS){ int型のカウント= 0、サイズ= nums.size(); ソート(NUMS。 ;()、nums.end())を開始 するために(int型。I> = 2; i--){1 - I =サイズ// [I] NUMは、Cであり、 INT右= I 0 =左- 1、。/ / NUMは、[左] [右]であるB、NUMであり 、一方(左< 右){ IF(NUMS [左] + NUMS [右]> NUMS [I]){ COUNT ; - (左右)+ = //それを説明するべきではありません 右- ; // すべての三角形が左にB、Bに表示される計算 } 他{ 左 ++; // と小さすぎる、右 } } } 戻りCOUNT; } };