📜  数组中最大平衡和的Java程序

📅  最后修改于: 2022-05-13 01:54:31.179000             🧑  作者: Mango

数组中最大平衡和的Java程序

给定一个数组 arr[]。找到前缀和的最大值,它也是 arr[] 中索引 i 的后缀和。

例子 :

Input : arr[] = {-1, 2, 3, 0, 3, 2, -1}
Output : 4
Prefix sum of arr[0..3] = 
            Suffix sum of arr[3..6]

Input : arr[] = {-2, 5, 3, 1, 2, 6, -4, 2}
Output : 7
Prefix sum of arr[0..3] = 
              Suffix sum of arr[3..7]

一个简单的解决方案是逐一检查每个元素的给定条件(前缀和等于后缀和),并返回满足给定条件的最大值的元素。

Java
// java program to find maximum
// equilibrium sum.
import java.io.*;
 
class GFG {
     
    // Function to find maximum
    // equilibrium sum.
    static int findMaxSum(int []arr, int n)
    {
        int res = Integer.MIN_VALUE;
         
        for (int i = 0; i < n; i++)
        {
            int prefix_sum = arr[i];
             
            for (int j = 0; j < i; j++)
                prefix_sum += arr[j];
         
            int suffix_sum = arr[i];
             
            for (int j = n - 1; j > i; j--)
                suffix_sum += arr[j];
         
            if (prefix_sum == suffix_sum)
                res = Math.max(res, prefix_sum);
        }
         
        return res;
    }
     
    // Driver Code
    public static void main (String[] args)
    {
        int arr[] = {-2, 5, 3, 1, 2, 6, -4, 2 };
        int n = arr.length;
        System.out.println(findMaxSum(arr, n));
    }
}
 
// This code is contributed by anuj_67.


Java
// Java program to find maximum equilibrium sum.
import java.io.*;
 
public class GFG {
     
 
    // Function to find maximum
    // equilibrium sum.
    static int findMaxSum(int []arr, int n)
    {
         
        // Array to store prefix sum.
        int []preSum = new int[n];
     
        // Array to store suffix sum.
        int []suffSum = new int[n];
     
        // Variable to store maximum sum.
        int ans = Integer.MIN_VALUE;
     
        // Calculate prefix sum.
        preSum[0] = arr[0];
        for (int i = 1; i < n; i++)
            preSum[i] = preSum[i - 1] + arr[i];
     
        // Calculate suffix sum and compare
        // it with prefix sum. Update ans
        // accordingly.
        suffSum[n - 1] = arr[n - 1];
         
        if (preSum[n - 1] == suffSum[n - 1])
            ans = Math.max(ans, preSum[n - 1]);
             
        for (int i = n - 2; i >= 0; i--)
        {
            suffSum[i] = suffSum[i + 1] + arr[i];
             
            if (suffSum[i] == preSum[i])
                ans = Math.max(ans, preSum[i]);
        }
     
        return ans;
    }
     
    // Driver Code
    static public void main (String[] args)
    {
        int []arr = { -2, 5, 3, 1, 2, 6, -4, 2 };
        int n = arr.length;
         
        System.out.println( findMaxSum(arr, n));
    }
}
 
// This code is contributed by anuj_67


Java
// Java program to find maximum equilibrium
// sum.
import java.lang.Math.*;
import java.util.stream.*;
 
class GFG {
     
    // Function to find maximum equilibrium
    // sum.
    static int findMaxSum(int arr[], int n)
    {
        int sum = IntStream.of(arr).sum();
        int prefix_sum = 0,
        res = Integer.MIN_VALUE;
         
        for (int i = 0; i < n; i++)
        {
            prefix_sum += arr[i];
             
            if (prefix_sum == sum)
                res = Math.max(res, prefix_sum);
            sum -= arr[i];
        }
         
        return res;
    }
     
    // Driver Code
    public static void main(String[] args)
    {
        int arr[] = { -2, 5, 3, 1,
                    2, 6, -4, 2 };
        int n = arr.length;
        System.out.print(findMaxSum(arr, n));
    }
}
 
// This code is contributed by Smitha.


输出 :
7

时间复杂度: O(n 2 )
辅助空间: O(n)

更好的方法是遍历数组并将每个索引的前缀和存储在数组presum[]中,其中presum[i]存储子数组arr[0..i]的和。再次遍历数组并将后缀和存储在另一个数组 suffsum[] 中,其中 suffsum[i] 存储子数组 arr[i..n-1] 的和。在此之后为每个索引检查 presum[i] 是否等于 suffsum[i] 并且如果它们相等,则将它们的值与迄今为止的总体最大值进行比较。

Java

// Java program to find maximum equilibrium sum.
import java.io.*;
 
public class GFG {
     
 
    // Function to find maximum
    // equilibrium sum.
    static int findMaxSum(int []arr, int n)
    {
         
        // Array to store prefix sum.
        int []preSum = new int[n];
     
        // Array to store suffix sum.
        int []suffSum = new int[n];
     
        // Variable to store maximum sum.
        int ans = Integer.MIN_VALUE;
     
        // Calculate prefix sum.
        preSum[0] = arr[0];
        for (int i = 1; i < n; i++)
            preSum[i] = preSum[i - 1] + arr[i];
     
        // Calculate suffix sum and compare
        // it with prefix sum. Update ans
        // accordingly.
        suffSum[n - 1] = arr[n - 1];
         
        if (preSum[n - 1] == suffSum[n - 1])
            ans = Math.max(ans, preSum[n - 1]);
             
        for (int i = n - 2; i >= 0; i--)
        {
            suffSum[i] = suffSum[i + 1] + arr[i];
             
            if (suffSum[i] == preSum[i])
                ans = Math.max(ans, preSum[i]);
        }
     
        return ans;
    }
     
    // Driver Code
    static public void main (String[] args)
    {
        int []arr = { -2, 5, 3, 1, 2, 6, -4, 2 };
        int n = arr.length;
         
        System.out.println( findMaxSum(arr, n));
    }
}
 
// This code is contributed by anuj_67
输出:
7

时间复杂度: O(n)
辅助空间: O(n)

进一步优化:
我们可以通过首先计算总和,然后使用它来查找当前前缀和后缀总和来避免使用额外的空间。

Java

// Java program to find maximum equilibrium
// sum.
import java.lang.Math.*;
import java.util.stream.*;
 
class GFG {
     
    // Function to find maximum equilibrium
    // sum.
    static int findMaxSum(int arr[], int n)
    {
        int sum = IntStream.of(arr).sum();
        int prefix_sum = 0,
        res = Integer.MIN_VALUE;
         
        for (int i = 0; i < n; i++)
        {
            prefix_sum += arr[i];
             
            if (prefix_sum == sum)
                res = Math.max(res, prefix_sum);
            sum -= arr[i];
        }
         
        return res;
    }
     
    // Driver Code
    public static void main(String[] args)
    {
        int arr[] = { -2, 5, 3, 1,
                    2, 6, -4, 2 };
        int n = arr.length;
        System.out.print(findMaxSum(arr, n));
    }
}
 
// This code is contributed by Smitha.
输出 :
7

时间复杂度: O(n)
辅助空间: O(1)

有关更多详细信息,请参阅有关数组中最大平衡和的完整文章!