leetcode【毎日の問題】行列を同じ三つの部分Javaに分けます。
15218 ワード
問題を解く
整数配列Aをあげます。3つと等しい非空の部分に分割した時だけtrueに戻ります。そうでなければfalseに戻ります。
形式上、索引i+1<jを見つけて(A[0]+A[1]+A[i]==A[i+1]+A[i+1]+A[i+2]+A[j-1]==A[j]+A[J-1]+A[A.length-1]を満足させることができれば、配列を3等分することができます。
例1:
先に求めてsumと更に遍歴して、1つの区間がsum/3に等しいとカウントします。最後のカウントは3以上です。
ここで注意すると、3以上の場合があります。例えば、[-1,1,-1,1,1]
もちろん、二重の針も簡単です。もう詳しく説明しなくてもいいです。
javaコード
整数配列Aをあげます。3つと等しい非空の部分に分割した時だけtrueに戻ります。そうでなければfalseに戻ります。
形式上、索引i+1<jを見つけて(A[0]+A[1]+A[i]==A[i+1]+A[i+1]+A[i+2]+A[j-1]==A[j]+A[J-1]+A[A.length-1]を満足させることができれば、配列を3等分することができます。
例1:
:[0,2,1,-6,6,-7,9,1,2,0,1]
:true
:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1
例2: :[0,2,1,-6,6,7,9,-1,2,0,1]
:false
例3: :[3,3,6,5,-2,2,5,1,-9,4]
:true
:3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4
考え方先に求めてsumと更に遍歴して、1つの区間がsum/3に等しいとカウントします。最後のカウントは3以上です。
ここで注意すると、3以上の場合があります。例えば、[-1,1,-1,1,1]
もちろん、二重の針も簡単です。もう詳しく説明しなくてもいいです。
javaコード
package daily;
public class CanThreePartsEqualSum {
public boolean canThreePartsEqualSum(int[] A) {
int sum = 0;//
int tem = 0;//
int count = 0;// sum/3
for (int num : A
) {
sum += num;
}
if (sum % 3 != 0) {
return false;
}
for (int num : A
) {
tem += num;
if (tem == sum / 3) {
count++;
tem = 0;
}
}
return count>=3;
}
public static void main (String [] args){
CanThreePartsEqualSum canThreePartsEqualSum=new CanThreePartsEqualSum();
int []A ={0,2,1,-6,6,-7,9,1,2,0,1};
int []B={0,2,1,-6,6,7,9,-1,2,0,1};
int []C={3,3,6,5,-2,2,5,1,-9,4};
int[] test={18,12,-18,18,-19,-1,10,10};
System.out.println( canThreePartsEqualSum.canThreePartsEqualSum(A));
System.out.println( canThreePartsEqualSum.canThreePartsEqualSum(B));
System.out.println( canThreePartsEqualSum.canThreePartsEqualSum(C));
System.out.println(canThreePartsEqualSum.canThreePartsEqualSum(test));
}
}
leetcodeの答えは全部私のgitにアップロードされました。