[LeetCode】3つの部品と同等の和の中へ1013パーティションのアレイ

アレイは3等分されています。質問の意味があなたの整数Aの配列を与えることです、あなたはそうでない場合はfalseに分け、唯一の真の唯一の3つの非ヌルと同等の一部を返すことができます。例、

例1:

入力:A = [0,2,1、-6,6-、-7,9,1,2,0,1] 
出力:真の
説明:0 + 2 + 1 = -6 + 6から7 + 9 + 1 = 2 + 0 + 1

例2:

入力:A = [0,2,1、-6,6,7,9、-1,2,0,1] 
出力:偽

例3:

入力:A = [3,3,6,5、-2,2,5,1、-9,4] 
出力:真の
説明:3 + 3 = 6 = 5から2 + 2 + 5 + 1 - 9 + 4

アイデアは、ダブルポインタで行うことです。第1の判定コーナーケースは、全体のアレイと3で割り切れないすべての添加元素の合計が、それは偽でなければならない場合。その後、二重leftSumが残っているかどうか確認するために、両側から接近ポインタ、右はrightSum 1/3合計されている可能性が。注(<右を左の)書き込みは、例えば、以下のケースを説明する場合には、(+ 1 <右を左)、ループ終了条件ながらダブルポインタという。

入力
[1、-1,1、-1]
出力
予想

時間O(N)

スペースO(N) - 二つの配列を格納するために使用されるとrightSum leftSum

Java実装

1  クラスソリューション{
 2      公共 ブール canThreePartsEqualSum(INT [] A){
 3。         INT SUM = 0 ;
 4。         ためINT I:A){
 5              SUM + = I;
 6。         }
 7。         // コーナーケース
8。         IF(SUM 3%。! = 0 ){
 9              // 和直接バックfalseに3の倍数ではない
10              リターン falseに;
 11          }
 12である 
13れる         // 時間節約、2見つけるためにアレイから始まる、二重ポインタ
14          のintを0 =左;
 15          INT leftSum = A [左];
 16          INT右A.length = - 1 ;
 17。         INT rightSum = A [右];
 18である 
19。         // 使用のみアレイを防止する、<1 +右の理由を残し二つの部分に分かれ
 20          // 例:[1、-1,1、-1]決意として、左<右の条件を使用して、エラーが発生し
21である         一方で(1 +は<左が右){
 22は、             IF / ==(SUM leftSum 3。 。SUM rightSum == && / 3 ){
 23であり                 、// 左右合計/ 3に等しいだけでなく、中間に等しくなければならない
24                  リターン 真へ;
 25              }
 26は、             IF(!。leftSum = SUMは/ 3 ){
 27                  // 0が初期値を与える=左、最初++左べきで、A = + leftSumでは、[左]; 
28                  leftSum + = A [++ 左];
 29              }
 30              IF(rightSum != SUM / 3 ){
 31である                 // 。; =右A.length - - 1は、初期値を与え、第1の右べきである、[右] + rightSumで= 
32                  [ - rightSum = A + 右];
 33です             }
 34は         }
 35          リターン falseに;
 36      }
 37 }

 

JavaScript実装

1  / * *
 2  * @param {数[]}
 3  * @return {ブール}
 4   * / 
5  VAR canThreePartsEqualSum = 関数(A){
 6      LET和= 0 7      のための(AのNUM){
 8          和+ = NUM。
9      }
 10  
11      // コーナーケース
12      であれば(和%3 == 0] ){
 13          リターン 14      }
 15  
16      // 通常の場合
17      LET = 0を残し18である      LET leftSum = ; A [左]
 19。      せ右A.length = - 1 ;
 20である      LET rightSum = [右] A
 21は     、一方(。+ 1左< 右){
 22は         IF(SUM leftSum === / 3 && === SUM rightSum / 3 ){
 23れる             // 左右和/ 3に等しいだけでなく、中間に等しくなければならない
24              リターン 真へ;
 25          }
 26である         IF(SUM leftSum == / 3!){
 27              // 左= 0が得られます初期値は、最初++左べきで、Aは= + leftSum [左]で、
28              leftSum + = A [++ 左];
 29         }
 30          IF(RightSum SUM == / 3!){
 31は             // 右A.length = - 1が初期値を与え、第1の右必要があります- 、A = + rightSum [右]に; 
32              rightSum = A + [ - - 右];
 33である         }
 34である     }
 35      リターン falseに;
 36 }。

 

おすすめ

転載: www.cnblogs.com/aaronliu1991/p/12461640.html