数组中最大平衡和的 C++ 程序
给定一个数组 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]
一个简单的解决方案是逐一检查每个元素的给定条件(前缀和等于后缀和),并返回满足给定条件的最大值的元素。
C++
// CPP program to find
// maximum equilibrium sum.
#include
using namespace std;
// Function to find
// maximum equilibrium sum.
int findMaxSum(int arr[], int n)
{
int res = INT_MIN;
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 = max(res, prefix_sum);
}
return res;
}
// Driver Code
int main()
{
int arr[] = {-2, 5, 3, 1,
2, 6, -4, 2 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << findMaxSum(arr, n);
return 0;
}
C++
// CPP program to find
// maximum equilibrium sum.
#include
using namespace std;
// Function to find maximum
// equilibrium sum.
int findMaxSum(int arr[], int n)
{
// Array to store prefix sum.
int preSum[n];
// Array to store suffix sum.
int suffSum[n];
// Variable to store maximum sum.
int ans = INT_MIN;
// 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 = 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 = max(ans, preSum[i]);
}
return ans;
}
// Driver Code
int main()
{
int arr[] = { -2, 5, 3, 1,
2, 6, -4, 2 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << findMaxSum(arr, n);
return 0;
}
C++
// CPP program to find
// maximum equilibrium sum.
#include
using namespace std;
// Function to find
// maximum equilibrium sum.
int findMaxSum(int arr[], int n)
{
int sum = accumulate(arr, arr + n, 0);
int prefix_sum = 0, res = INT_MIN;
for (int i = 0; i < n; i++)
{
prefix_sum += arr[i];
if (prefix_sum == sum)
res = max(res, prefix_sum);
sum -= arr[i];
}
return res;
}
// Driver Code
int main()
{
int arr[] = { -2, 5, 3, 1,
2, 6, -4, 2 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << findMaxSum(arr, n);
return 0;
}
输出 :
7
时间复杂度: O(n 2 )
辅助空间: O(n)
更好的方法是遍历数组并将每个索引的前缀和存储在数组presum[]中,其中presum[i]存储子数组arr[0..i]的和。再次遍历数组并将后缀和存储在另一个数组 suffsum[] 中,其中 suffsum[i] 存储子数组 arr[i..n-1] 的和。在此之后为每个索引检查 presum[i] 是否等于 suffsum[i] 并且如果它们相等,则将它们的值与迄今为止的总体最大值进行比较。
C++
// CPP program to find
// maximum equilibrium sum.
#include
using namespace std;
// Function to find maximum
// equilibrium sum.
int findMaxSum(int arr[], int n)
{
// Array to store prefix sum.
int preSum[n];
// Array to store suffix sum.
int suffSum[n];
// Variable to store maximum sum.
int ans = INT_MIN;
// 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 = 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 = max(ans, preSum[i]);
}
return ans;
}
// Driver Code
int main()
{
int arr[] = { -2, 5, 3, 1,
2, 6, -4, 2 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << findMaxSum(arr, n);
return 0;
}
输出:
7
时间复杂度: O(n)
辅助空间: O(n)
进一步优化:
我们可以通过首先计算总和,然后使用它来查找当前前缀和后缀总和来避免使用额外的空间。
C++
// CPP program to find
// maximum equilibrium sum.
#include
using namespace std;
// Function to find
// maximum equilibrium sum.
int findMaxSum(int arr[], int n)
{
int sum = accumulate(arr, arr + n, 0);
int prefix_sum = 0, res = INT_MIN;
for (int i = 0; i < n; i++)
{
prefix_sum += arr[i];
if (prefix_sum == sum)
res = max(res, prefix_sum);
sum -= arr[i];
}
return res;
}
// Driver Code
int main()
{
int arr[] = { -2, 5, 3, 1,
2, 6, -4, 2 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << findMaxSum(arr, n);
return 0;
}
输出 :
7
时间复杂度: O(n)
辅助空间: O(1)
有关更多详细信息,请参阅有关数组中最大平衡和的完整文章!