その一般的な変形では、この問題は2つの制約を課し、より簡単な方法で実行できます。
- パーティションが配列の長さに沿ったどこかでしか実行できない場合(要素の順序が狂っているとは見なされません)
- 負の数はありません。
次に機能するアルゴリズムは次のとおりです。
- leftSumとrightSumの2つの変数があります
- 配列の左からleftSum、右からrightSumのインクリメントを開始します。
- その中の不均衡を修正してみてください。
次のコードは上記を実行します。
public boolean canBalance(int[] nums) {
int leftSum = 0, rightSum = 0, i, j;
if(nums.length == 1)
return false;
for(i=0, j=nums.length-1; i<=j ;){
if(leftSum <= rightSum){
leftSum+=nums[i];
i++;
}else{
rightSum+=nums[j];
j--;
}
}
return (rightSum == leftSum);
}
出力:
canBalance({1, 1, 1, 2, 1}) → true OK
canBalance({2, 1, 1, 2, 1}) → false OK
canBalance({10, 10}) → true OK
canBalance({1, 1, 1, 1, 4}) → true OK
canBalance({2, 1, 1, 1, 4}) → false OK
canBalance({2, 3, 4, 1, 2}) → false OK
canBalance({1, 2, 3, 1, 0, 2, 3}) → true OK
canBalance({1, 2, 3, 1, 0, 1, 3}) → false OK
canBalance({1}) → false OK
canBalance({1, 1, 1, 2, 1}) → true OK
もちろん、要素を順不同で組み合わせることができる場合、それはすべての複雑さを伴うパーティションの問題になります。