📌  相关文章
📜  查找数组是否可以分为两个相等和的子数组

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

查找数组是否可以分为两个相等和的子数组

给定一个整数数组,找出是否可以从数组中只删除一个整数,将数组分成两个总和相同的子数组。
例子:

Input:  arr = [6, 2, 3, 2, 1]
Output:  true
Explanation:  On removing element 2 at index 1,
the array gets divided into two subarrays [6]
 and [3, 2, 1] having equal sum

Input:  arr = [6, 1, 3, 2, 5]
Output:  true
Explanation:  On removing element 3 at index 2,
the array gets divided into two subarrays [6, 1]
and [2, 5] having equal sum.

Input:  arr = [6, -2, -3, 2, 3]
Output: true
Explanation:  On removing element 6 at index 0, 
the array gets divided into two sets [] 
and [-2, -3, 2, 3] having equal sum

Input:  arr = [6, -2, 3, 2, 3]
Output: false

一个简单的解决方案是考虑数组的所有元素并计算它们的左右和,如果发现左右和相等,则返回 true。该解决方案的时间复杂度为 O(n 2 )。
有效的解决方案包括提前计算数组所有元素的总和。然后对于数组的每个元素,我们可以通过使用数组元素的总和减去到目前为止找到的元素的总和,在 O(1) 时间内计算出它的正确和。该解决方案的时间复杂度为 O(n),其使用的辅助空间为 O(1)。
以下是上述方法的实现:

C++
// C++ program to divide the array into two
// subarrays with the same sum on removing
// exactly one integer from the array
#include 
using namespace std;
 
// Utility function to print the sub-array
void printSubArray(int arr[], int start, int end)
{
    cout << "[ ";
    for (int i = start; i <= end; i++)
        cout << arr[i] << " ";
    cout << "] ";
}
 
// Function that divides the array into two subarrays
// with the same sum
bool divideArray(int arr[], int n)
{
    // sum stores sum of all elements of the array
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += arr[i];
 
    // sum stores sum till previous index of the array
    int sum_so_far = 0;
 
    for (int i = 0; i < n; i++)
    {
        // If on removing arr[i], we get equals left
        // and right half
        if (2 * sum_so_far + arr[i] == sum)
        {
            cout << "The array can be divided into
                    "two subarrays with equal sum\nThe"
                    " two subarrays are - ";
            printSubArray(arr, 0, i - 1);
            printSubArray(arr, i + 1, n - 1);
 
            return true;
        }
        // add current element to sum_so_far
        sum_so_far += arr[i];
    }
 
    // The array cannot be divided
    cout << "The array cannot be divided into two "
         "subarrays with equal sum";
 
    return false;
}
 
// Driver code
int main()
{
    int arr[] = {6, 2, 3, 2, 1};
    int n = sizeof(arr)/sizeof(arr[0]);
 
    divideArray(arr, n);
 
    return 0;
}


Java
// Java program to divide the array into two
// subarrays with the same sum on removing
// exactly one integer from the array
import java.io.*;
 
class GFG
{
    // Utility function to print the sub-array
    static void printSubArray(int arr[], int start, int end)
    {
        System.out.print("[ ");
        for (int i = start; i <= end; i++)
            System.out.print(arr[i] +" ");
        System.out.print("] ");
    }
     
    // Function that divides the array into two subarrays
    // with the same sum
    static boolean divideArray(int arr[], int n)
    {
        // sum stores sum of all elements of the array
        int sum = 0;
        for (int i = 0; i < n; i++)
            sum += arr[i];
  
        // sum stores sum till previous index of the array
        int sum_so_far = 0;
  
        for (int i = 0; i < n; i++)
        {
            // If on removing arr[i], we get equals left
            // and right half
            if (2 * sum_so_far + arr[i] == sum)
            {
                System.out.print("The array can be divided into "
                    +"two subarrays with equal sum\nThe"
                    +" two subarrays are - ");
                printSubArray(arr, 0, i - 1);
                printSubArray(arr, i + 1, n - 1);
  
                return true;
            }
            // add current element to sum_so_far
            sum_so_far += arr[i];
        }
  
        // The array cannot be divided
        System.out.println("The array cannot be divided into two "
                +"subarrays with equal sum");
                 
        return false;
    }
     
    // Driver program
    public static void main (String[] args)
    {
        int arr[] = {6, 2, 3, 2, 1};
        int n = arr.length;
  
        divideArray(arr, n);
    }
}
 
// This code is contributed by Pramod Kumar


Python3
''' Python3 program to divide the array
into two subarrays with the same sum on
removing exactly one integer from the array'''
 
# Utility function to print the sub-array
def printSubArray(arr, start, end):
    print ("[ ", end = "")
    for i in range(start, end+1):
        print (arr[i], end =" ")
    print ("]", end ="")
 
# Function that divides the array into
# two subarrays with the same sum
def divideArray(arr, n):
 
    # sum stores sum of all
    # elements of the array
    sum = 0
    for i in range(0, n):
        sum += arr[i]
 
    # sum stores sum till previous
    # index of the array
    sum_so_far = 0
    for i in range(0, n):
 
        # If on removing arr[i], we get
        # equals left and right half
        if 2 * sum_so_far + arr[i] == sum:
            print ("The array can be divided into",
                    "two subarrays with equal sum")
            print ("two subarrays are -", end = "")
            printSubArray(arr, 0, i - 1)
            printSubArray(arr, i + 1, n - 1)
            return True
 
        # add current element to sum_so_far
        sum_so_far += arr[i]
 
    # The array cannot be divided
    print ("The array cannot be divided into"
           "two subarrays with equal sum", end = "")
 
    return False
 
# Driver code
arr = [6, 2, 3, 2, 1]
n = len(arr)
divideArray(arr, n)
 
# This code is contributed by Shreyanshi Arun


C#
// C# program to divide the array into two
// subarrays with the same sum on removing
// exactly one integer from the array
using System;
 
class GFG {
     
    // Utility function to print the sub-array
    static void printSubArray(int []arr,
                           int start, int end)
    {
        Console.Write("[ ");
        for (int i = start; i <= end; i++)
            Console.Write(arr[i] +" ");
        Console.Write("] ");
    }
     
    // Function that divides the array into
    // two subarrays with the same sum
    static bool divideArray(int []arr, int n)
    {
         
        // sum stores sum of all elements of
        // the array
        int sum = 0;
        for (int i = 0; i < n; i++)
            sum += arr[i];
 
        // sum stores sum till previous index
        // of the array
        int sum_so_far = 0;
 
        for (int i = 0; i < n; i++)
        {
             
            // If on removing arr[i], we get
            // equals left and right half
            if (2 * sum_so_far + arr[i] == sum)
            {
                Console.Write("The array can be"
                 + " divided into two subarrays"
                 + " with equal sum\nThe two"
                 + " subarrays are - ");
                printSubArray(arr, 0, i - 1);
                printSubArray(arr, i + 1, n - 1);
 
                return true;
            }
            // add current element to sum_so_far
            sum_so_far += arr[i];
        }
 
        // The array cannot be divided
        Console.WriteLine("The array cannot be"
          + " divided into two subarrays with "
                                + "equal sum");
                 
        return false;
    }
     
    // Driver program
    public static void Main ()
    {
        int []arr = {6, 2, 3, 2, 1};
        int n = arr.Length;
 
        divideArray(arr, n);
    }
}
 
// This code is contributed by anuj_67.


PHP


Javascript


输出:

The array can be divided into two subarrays with equal sum
The two sets are - [6] [3 2 1]