在其常见的变体中,这个问题施加了 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
当然,如果元素可以乱序组合,它确实会变成具有复杂性的分区问题。