利用c++设置最大的前缀和等于后缀和的方法

214 阅读2分钟

给定一个有N个正整数的数组arr[],任务是找出最大的前缀和,同时也是后缀和,并且前缀和后缀不重叠。

例子。

输入。 N = 5, arr = [1, 3, 2, 1, 4]
输出。 4
解释: 考虑前缀[1, 3]和后缀[4],给出最大的
前缀和,也是后缀和,这样前缀和后缀不重叠。

输入。 N = 5, arr = [1, 3, 1, 1, 4]
输出。 5

办法。 这个问题可以用双指针技术来解决。

从数组的两端使用两个指针,保持前缀和后缀之和,不断移动指针直到它们重叠。

按照以下步骤来解决这个问题。

  • 声明并初始化两个变量i = 0j = N - 1
  • 声明并初始化两个变量来存储前缀和后缀之和,前缀=0后缀=0
  • 声明并初始化一个变量result,以保持最大可能的前缀和,result=0
  • i小于或等于
    • 如果前缀和小于后缀和,在第i个索引处添加数组元素到前缀和,并增加i的值。
    • 否则将第 j个索引的数组元素加入后缀和,并递减j的值**。**
    • 如果二者相等,则用前缀和更新结果变量。
  • 打印结果的值。

下面是上述方法的实现。

C++

// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the largest prefix
// whose sum is same as the suffix sum
// such that they don't overlap
int maxPrefixSum(int N, int* arr)
{
    // Pointers pointing first and
    // last index of array
    int i = 0, j = N - 1;
 
    // Variables to store prefix and suffixSum
    int prefixSum = 0, suffixSum = 0;
 
    // Variable to store result that is
    // maximum possible prefix sum
    int result = 0;
 
    // While prefix and suffix
    // do not overalp
    while (i <= j) {
 
        // If prefix sum is less than suffix sum
        // add array element at the ith index to
        // prefix sum and increment value of i.
        if (prefixSum < suffixSum) {
            prefixSum += arr[i];
            i++;
        }
 
        // Else add array element at the jth
        // index to suffix sum and decrement
        // value of j
        else {
            suffixSum += arr[j];
            j--;
        }
 
        // If both of them are equal update
        // result variable with prefix sum.
        if (prefixSum == suffixSum)
            result = prefixSum;
    }
 
    return result;
}
 
// Driver code
int main()
{
    int arr[] = { 1, 3, 1, 1, 4 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    cout << maxPrefixSum(N, arr);
    return 0;
}

输出

5

时间复杂度。 O(N)
辅助空间。O(1)