两个for循环用于对数组的两部分进行加权,找到数组的数组平衡点。
这样想:
你有一个空的天平,在外部 for 循环的第一次迭代中,i 为零。
来到第一个for循环,这里j是0,i是0i < j是假的,所以它没有进入第一个for循环,它进入第二个for循环并减去所有总和中的数字。
从外部 for 循环的第二次迭代开始,它开始进入第一个 for 循环并
开始将数组的元素一一添加到总和中。
在图片中,就像从一个空的天平秤开始,将所有元素添加到第二个秤,然后将一个元素移动到第一个秤,像这样:
最后,如果和为零,则数组可以平衡,所以返回true。如果总和不为 0,则为不平衡。
中的值由循环平衡,如下所示:
i为0时外层for循环的迭代
循环 2 -> i(0) j(0) 减 1,总和为 -1
循环 2 -> i(0) j(1) 减 3,总和为 -4
循环 2 -> i(0) j(2) 减 2,总和为 -6
循环 2 -> i(0) j(3) 减 6,总和为 -12
当 i 为 1 时外部 for 循环的迭代
循环 1 -> i(1) j(0) 加 1,总和为 1
循环 2 -> i(1) j(1) 减 3,总和为 -2
循环 2 -> i(1) j(2) 减 2,总和为 -4
循环 2 -> i(1) j(3) 减 6,总和为 -10
当 i 为 2 时外部 for 循环的迭代
循环 1 -> i(2) j(0) 加 1,总和为 1
循环 1 -> i(2) j(1) 加 3,总和为 4
循环 2 -> i(2) j(2) 减 2,总和为 2
循环 2 -> i(2) j(3) 减 6,总和为 -4
i 为 3 时外部 for 循环的迭代
循环 1 -> i(3) j(0) 加 1,总和为 1
循环 1 -> i(3) j(1) 加 3,总和为 4
循环 1 -> i(3) j(2) 加 2,总和为 6
循环 2 -> i(3) j(3) 减 6,总和为 0
最终结果为真,因此数组可以平衡
代码:
public class Test {
public static void main(String[] args) {
int[] test = { 1, 3, 2, 6 };
System.out.println("\nFinal result is "+canBalance(test));
}
public static boolean canBalance(int[] nums) {
for (int i = 0; i < nums.length; i++) {
System.out.println("\nIteration of outer for loop when i is " + i);
int sum = 0;
for (int j = 0; j < i; j++){
sum += nums[j];
System.out.println("Loop 1 -> i(" +i + ") j("+j + ") Add "+nums[j] + ", sum is "+sum+" ");
}
for (int j = i; j < nums.length; j++){
sum -= nums[j];
System.out.println("Loop 2 -> i(" +i + ") j("+j + ") Subtract "+nums[j] + ", sum is "+sum+" ");
}
if (sum == 0)
return true;
}
return false;
}
}
如果你想允许数组元素之间的混洗,你可以使用递归如下(cmets 是不言自明的)
public class Test {
public static void main(String[] args) {
int[] original = { 10, 2, 24, 32 };
System.out.println(canDivideArray(original));
}
private static boolean canDivideArray(int[] originalArray) {
int total = 0;
for (int number : originalArray) {
total += number;
}
// check if sum == 2x for any value of x
if (total % 2 != 0) {
return false;
} else {
// sum of each half array should be x
total /= 2;
}
return isTotal(originalArray, originalArray.length, total);
}
private static boolean isTotal(int array[], int n, int total) {
// successful termination condition
if (total == 0) {
return true;
}
// unsuccessful termination when elements have finished but total is not reached
if (n == 0 && total != 0){
return false;
}
// When last element is greater than total
if (array[n - 1] > total)
return isTotal(array, n - 1, total);
//check if total can be obtained excluding the last element or including the last element
return isTotal(array, n - 1, total - array[n - 1]) || isTotal(array, n - 1, total);
}
}