📌  相关文章
📜  划分为两个具有相等和的连续元素子数组

📅  最后修改于: 2021-09-17 07:44:06             🧑  作者: Mango

给定一个由 n 个正整数组成的数组。找到要添加到数组中的索引之一的最小正元素,以便可以将其划分为两个等和的连续子数组。输出要添加的最小元素和要添加的位置。如果可能有多个位置,则返回至少一个。
例子:

先决条件:前缀总和
方法一(简单):一个天真的方法是计算从(arr[0]到arr[i])和(arr[i+1]到arr[n-1])的元素之和,并在每一步找到这两个总和之间的差异,最小差异将给出要添加的元素。
方法二(高效) :仔细分析,我们可以使用前缀和和后缀和的概念。计算它们并找到 prefixSum[i](其中 prefixSum[i] 是数组元素到第 i 个位置的总和)和 suffixSum[i + 1](其中 suffixSum[i + 1] 是数组的总和)之间的绝对差从第 (i + 1) 个位置到最后一个位置的元素)。
例如

arr              10    1    2    3    4
prefixSum        10    11   13   16   20
suffixSum        20    10   9    7    4

Absolute difference between suffixSum[i + 1] and prefixSum[i]
10 - 10 = 0 // minimum
11 - 9  = 1
13 - 7  = 6
16 - 4  = 12
Thus, minimum element is 0, for position,
if prefixSum[i] is greater than suffixSum[i + 1], then position is "i + 1".
else it's is "i".

下面是上述方法的实现。

C++
// CPP Program to find the minimum element to
// be added such that the array can be partitioned
// into two contiguous subarrays with equal sums
#include 
 
using namespace std;
 
// Structure to store the minimum element
// and its position
struct data {
    int element;
    int position;
};
 
struct data findMinElement(int arr[], int n)
{
    struct data result;
     
    // initialize prefix and suffix sum arrays with 0
    int prefixSum[n] = { 0 };
    int suffixSum[n] = { 0 };
 
    prefixSum[0] = arr[0];
    for (int i = 1; i < n; i++) {
        // add current element to Sum
        prefixSum[i] = prefixSum[i - 1] + arr[i];
    }
 
    suffixSum[n - 1] = arr[n - 1];
    for (int i = n - 2; i >= 0; i--) {
        // add current element to Sum
        suffixSum[i] = suffixSum[i + 1] + arr[i];
    }
     
    // initialize the minimum element to be a large value
    int min = suffixSum[0];
    int pos;
 
    for (int i = 0; i < n - 1; i++) {
        // check for the minimum absolute difference
        // between current prefix sum and the next
        // suffix sum element
        if (abs(suffixSum[i + 1] - prefixSum[i]) < min) {
            min = abs(suffixSum[i + 1] - prefixSum[i]);
 
            // if prefixsum has a greater value then position
            // is the next element, else it's the same element.
            if (suffixSum[i + 1] < prefixSum[i]) pos = i + 1;
            else     pos = i;
        }
    }
 
    // return the data in struct.
    result.element = min;
    result.position = pos;
    return result;
}
 
// Driver Code
int main()
{
    int arr[] = { 10, 1, 2, 3, 4 };
    int n = sizeof(arr) / sizeof(arr[0]);
    struct data values;
 
    values = findMinElement(arr, n);
    cout << "Minimum element : " << values.element
        << endl << "Position : " << values.position;
    return 0;
}


Java
// Java Program to find the minimum element to
// be added such that the array can be partitioned
// into two contiguous subarrays with equal sums
import java.util.*;
 
class GFG
{
     
// Structure to store the minimum element
// and its position
static class data
{
    int element;
    int position;
};
 
static data findMinElement(int arr[], int n)
{
    data result=new data();
     
    // initialize prefix and suffix sum arrays with 0
    int []prefixSum = new int[n];
    int []suffixSum = new int[n];
 
    prefixSum[0] = arr[0];
    for (int i = 1; i < n; i++)
    {
        // add current element to Sum
        prefixSum[i] = prefixSum[i - 1] + arr[i];
    }
 
    suffixSum[n - 1] = arr[n - 1];
    for (int i = n - 2; i >= 0; i--)
    {
        // add current element to Sum
        suffixSum[i] = suffixSum[i + 1] + arr[i];
    }
     
    // initialize the minimum element to be a large value
    int min = suffixSum[0];
    int pos=0;
 
    for (int i = 0; i < n - 1; i++)
    {
        // check for the minimum absolute difference
        // between current prefix sum and the next
        // suffix sum element
        if (Math.abs(suffixSum[i + 1] - prefixSum[i]) < min)
        {
            min = Math.abs(suffixSum[i + 1] - prefixSum[i]);
 
            // if prefixsum has a greater value then position
            // is the next element, else it's the same element.
            if (suffixSum[i + 1] < prefixSum[i]) pos = i + 1;
            else     pos = i;
        }
    }
 
    // return the data in struct.
    result.element = min;
    result.position = pos;
    return result;
}
 
// Driver Code
public static void main(String[] args)
{
    int arr[] = { 10, 1, 2, 3, 4 };
    int n = arr.length;
    data values;
 
    values = findMinElement(arr, n);
    System.out.println("Minimum element : " + values.element
        + "\nPosition : " + values.position);
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python Program to find the minimum element to
# be added such that the array can be partitioned
# into two contiguous subarrays with equal sums
 
# Class to store the minimum element
# and its position
class Data:
    def __init__(self):
        self.element = -1
        self.position = -1
 
 
def findMinElement(arr, n):
    result = Data()
 
    # initialize prefix and suffix sum arrays with 0
    prefixSum = [0]*n
    suffixSum = [0]*n
 
    prefixSum[0] = arr[0]
    for i in range(1, n):
 
        # add current element to Sum
        prefixSum[i] = prefixSum[i-1] + arr[i]\
 
    suffixSum[n-1] = arr[n-1]
    for i in range(n-2, -1, -1):
 
        # add current element to Sum
        suffixSum[i] = suffixSum[i+1] + arr[i]
 
    # initialize the minimum element to be a large value
    mini = suffixSum[0]
    pos = 0
    for i in range(n-1):
 
        # check for the minimum absolute difference
        # between current prefix sum and the next
        # suffix sum element
        if abs(suffixSum[i+1]-prefixSum[i]) < mini:
            mini = abs(suffixSum[i+1] - prefixSum[i])
 
            # if prefixsum has a greater value then position
            # is the next element, else it's the same element.
            if suffixSum[i+1] < prefixSum[i]:
                pos = i+1
            else:
                pos = i
 
    # return the data in class.
    result.element = mini
    result.position = pos
 
    return result
 
 
# Driver Code
if __name__ == "__main__":
    arr = [10, 1, 2, 3, 4]
    n = len(arr)
    values = Data()
 
    values = findMinElement(arr, n)
 
    print("Minimum element :", values.element, "\nPosition :", values.position)
 
# This code is contributed by
# sanjeev2552


C#
// C# Program to find the minimum element
// to be added such that the array can be
// partitioned into two contiguous subarrays
// with equal sums
using System;
 
class GFG
{
     
// Structure to store the minimum element
// and its position
public class data
{
    public int element;
    public int position;
};
 
static data findMinElement(int []arr, int n)
{
    data result = new data();
     
    // initialize prefix and suffix
    // sum arrays with 0
    int []prefixSum = new int[n];
    int []suffixSum = new int[n];
 
    prefixSum[0] = arr[0];
    for (int i = 1; i < n; i++)
    {
        // add current element to Sum
        prefixSum[i] = prefixSum[i - 1] + arr[i];
    }
 
    suffixSum[n - 1] = arr[n - 1];
    for (int i = n - 2; i >= 0; i--)
    {
        // add current element to Sum
        suffixSum[i] = suffixSum[i + 1] + arr[i];
    }
     
    // initialize the minimum element
    // to be a large value
    int min = suffixSum[0];
    int pos = 0;
 
    for (int i = 0; i < n - 1; i++)
    {
        // check for the minimum absolute difference
        // between current prefix sum and the next
        // suffix sum element
        if (Math.Abs(suffixSum[i + 1] -
                     prefixSum[i]) < min)
        {
            min = Math.Abs(suffixSum[i + 1] -
                           prefixSum[i]);
 
            // if prefixsum has a greater value then position
            // is the next element, else it's the same element.
            if (suffixSum[i + 1] < prefixSum[i])
                pos = i + 1;
            else    
                pos = i;
        }
    }
 
    // return the data in struct.
    result.element = min;
    result.position = pos;
    return result;
}
 
// Driver Code
public static void Main(String[] args)
{
    int []arr = { 10, 1, 2, 3, 4 };
    int n = arr.Length;
    data values;
 
    values = findMinElement(arr, n);
    Console.WriteLine("Minimum element : " +
                            values.element +
                           "\nPosition : " +
                           values.position);
}
}
 
// This code is contributed by PrinciRaj1992


Javascript


输出:

Minimum element : 0
Position : 0

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程