JavaScript 用于寻找数组中最大的平衡和
给定数组的平衡和是指数组中某个特定点或索引后的子数组的总和等于从索引0到当前索引(包括当前索引)的子数组的总和。我们将在JavaScript中使用不同的方法来看示例和代码实现。
问题简介
我们获得了一个单独的数组,我们需要找到一个点,在该点左侧(包括当前索引元素)的元素总和等于右侧(不包括当前索引元素)的元素总和。可能存在多个满足平衡和属性的索引,对于这些情况,我们需要返回最大的和。
例如
The given array is: 2, 3, -1, 0, -1, 2, 3
In the above array, the maximum equilibrium sum is 4 which can be found at both indexes 2 and 3.
我们将看到三种寻找最大平衡和的方法。
原生方法
在这种方法中,我们将使用嵌套的for循环遍历数组。
// function to get the equilibrium sum
function equiSum(arr){
// getting the length of the array
var n = arr.length
// initializing the answer
var ans = 0
// traversing over the array
for(var i =0; i<n; i++) {
var sum1 = 0;
// getting sum upto the current index
for(var j =0; j<= i; j++) {
sum1 += arr[j]
}
var sum2 = 0;
// getting sum of elements present after the current element
for(var j = i+1; j<n; j++) {
sum2 += arr[j];
}
if(sum1 == sum2 && ans < sum1) {
ans = sum1
}
}
console.log("The maximum equilibrium sum in the given array is: " + ans);
}
// defining the array
arr = [2, 3, -1, 0, -1, 2, 3]
equiSum(arr)
时间和空间复杂度
上述代码的时间复杂度是O(N*N),其中N是给定数组的大小,因为我们对给定数组的每个元素进行了遍历。
上述代码的空间复杂度是O(1),因为我们没有使用额外的空间。
前缀和后缀数组方法
在这个方法中,我们将维护后缀数组和前缀数组,并基于它们来尝试找到答案。
示例
// function to get the equilibrium sum
function equiSum(arr){
// getting the length of the array
var n = arr.length
// initializing the answer
var ans = 0
// traversing over the array to get the prefix sum
var preSum = new Array(n)
preSum[0] = arr[0];
for(var i =1; i<n; i++) {
preSum[i] = preSum[i-1] + arr[i];
}
var sufSum = new Array(n)
sufSum[0] = arr[n-1];
for(var i = n-2; i>=0;i--){
sufSum[n-i-1] = sufSum[n-i-2] + arr[i];
}
// traversing over the array
for(var i = 0; i<n-1; i++){
if(preSum[i] == sufSum[n-i-2] && ans < preSum[i]){
ans = preSum[i];
}
}
console.log("The maximum equilibrium sum in the given array is: " + ans);
}
// defining the array
arr = [2, 3, -1, 0, -1, 2, 3]
equiSum(arr)
时间和空间复杂度
上述代码的时间复杂度为O(N),其中N是给定数组的大小,因为我们只遍历给定数组三次。
上述代码的空间复杂度为O(N),因为我们将前缀和后缀和存储在大小为N的数组中。
高效处理方法
在这种方法中,我们将维护两个变量,并使用它们来获得所需的答案。
// function to get the equilibrium sum
function equiSum(arr){
// getting the length of the array
var n = arr.length
// initializing the answer
var ans = 0
// traversing over the array to get the total sum
var total_sum = 0
for(var i =0; i<n; i++) {
total_sum += arr[i]
}
// traversing over the array
var cur_sum = 0;
for(var i = 0; i<n-1; i++) {
cur_sum += arr[i];
total_sum -= arr[i];
if(cur_sum == total_sum && ans < cur_sum) {
ans = cur_sum
}
}
console.log("The maximum equilibrium sum in the given array is: " + ans);
}
// defining the array
arr = [2, 3, -1, 0, -1, 2, 3]
equiSum(arr)
时间和空间复杂度
上述代码的时间复杂度是O(N),其中N是给定数组的大小,因为我们只遍历了给定数组的每个元素两次。
上述代码的空间复杂度是O(1),因为我们没有使用任何额外的空间。
结论
在上面的教程中,我们实现了一个JavaScript程序,用于计算数组中的最大平衡和。平衡和是指左边的元素总和(包括当前索引元素)等于右边的元素总和(不包括当前索引元素)。我们介绍了三种方法以及它们的时间和空间复杂度:原生方法O(N*N)和O(1),前缀和O(N)和O(N),以及高效方法O(N)和O(1)。