В обычном варианте эта проблема накладывает 2 ограничения, и это можно сделать более простым способом.
- Если разбиение можно выполнить только где-то по длине массива (мы не делаемсчитать элементы не по порядку)
- Нет отрицательных чисел.
В таком случае алгоритм может быть таким:
- Имеет 2 переменные, leftSum иrightSum
- Начните увеличивать 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
Конечно, если элементы могут быть скомбинированы не по порядку, это превращается в проблему разбиения со всей своей сложностью.