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)。

更新于:2023年4月14日

1K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告