📌  相关文章
📜  将一个数组拆分为两个相等的 Sum 子数组

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

将一个数组拆分为两个相等的 Sum 子数组

给定一个大于零的整数数组,找出是否可以将其拆分为两个子数组(不重新排序元素),使得两个子数组的和相同。打印两个子数组。
例子 :

Input : Arr[] = { 1 , 2 , 3 , 4 , 5 , 5  }
Output :  { 1 2 3 4 } 
          { 5 , 5 }

Input : Arr[] = { 4, 1, 2, 3 }
Output : {4 1}
         {2 3}

Input : Arr[] = { 4, 3, 2, 1}
Output : Not Possible

提问:脸书采访

一个简单的解决方案是运行两个循环来拆分数组并检查是否可以将数组拆分为两部分,使得 first_part 的总和等于 second_part 的总和。
下面是上述想法的实现。

C++
// C++ program to split an array into Two
// equal sum subarrays
#include
using namespace std;
 
// Returns split point. If not possible, then
// return -1.
int findSplitPoint(int arr[], int n)
{
    int leftSum = 0 ;
 
    // traverse array element
    for (int i = 0; i < n; i++)
    {
        // add current element to left Sum
        leftSum += arr[i] ;
 
        // find sum of rest array elements (rightSum)
        int rightSum = 0 ;
        for (int j = i+1 ; j < n ; j++ )
            rightSum += arr[j] ;
 
        // split point index
        if (leftSum == rightSum)
            return i+1 ;
    }
 
    // if it is not possible to split array into
    // two parts
    return -1;
}
 
// Prints two parts after finding split point using
// findSplitPoint()
void printTwoParts(int arr[], int n)
{
    int splitPoint = findSplitPoint(arr, n);
 
    if (splitPoint == -1 || splitPoint == n )
    {
        cout << "Not Possible" <


Java
// Java program to split an array
// into two equal sum subarrays
import java.io.*;
 
class GFG {
 
    // Returns split point. If
    // not possible, then return -1.
    static int findSplitPoint(int arr[], int n)
    {
     
    int leftSum = 0 ;
 
    // traverse array element
    for (int i = 0; i < n; i++)
    {
        // add current element to left Sum
        leftSum += arr[i] ;
 
        // find sum of rest array
        // elements (rightSum)
        int rightSum = 0 ;
         
        for (int j = i+1 ; j < n ; j++ )
            rightSum += arr[j] ;
 
        // split point index
        if (leftSum == rightSum)
            return i+1 ;
    }
 
    // if it is not possible to
    // split array into two parts
    return -1;
    }  
 
    // Prints two parts after finding
    // split point using findSplitPoint()
    static void printTwoParts(int arr[], int n)
    {
     
        int splitPoint = findSplitPoint(arr, n);
     
        if (splitPoint == -1 || splitPoint == n )
        {
            System.out.println("Not Possible");
            return;
        }
         
        for (int i = 0; i < n; i++)
        {
            if(splitPoint == i)
               System.out.println();
                
            System.out.print(arr[i] + " ");
             
        }
    }
 
// Driver program
     
    public static void main (String[] args) {
     
    int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
    int n = arr.length;
    printTwoParts(arr, n);
     
    }
}
 
// This code is contributed by vt_m


Python3
# Python3 program to split an array into Two
# equal sum subarrays
  
# Returns split point. If not possible, then
# return -1.
def findSplitPoint(arr, n) :
  
    leftSum = 0
   
    # traverse array element
    for i in range(0, n) :
      
        # add current element to left Sum
        leftSum += arr[i]
   
        # find sum of rest array elements (rightSum)
        rightSum = 0
        for j in range(i+1, n) :
            rightSum += arr[j]
   
        # split poindex
        if (leftSum == rightSum) :
            return i+1
      
   
    # if it is not possible to split array into
    # two parts
    return -1
  
   
# Prints two parts after finding split pousing
# findSplitPoint()
def printTwoParts(arr, n) :
  
    splitPo = findSplitPoint(arr, n)
   
    if (splitPo == -1 or splitPo == n ) :
        print ("Not Possible")
        return
      
    for i in range(0, n) :
        if(splitPo == i) :
            print ("")
        print (str(arr[i]) + ' ',end='')
  
# driver program
arr = [1 , 2 , 3 , 4 , 5 , 5]
n = len(arr)
printTwoParts(arr, n)
 
# This code is contributed by Manish Shaw
# (manishshaw1)


C#
// C# program to split an array
// into two equal sum subarrays
using System;
 
class GFG {
 
    // Returns split point. If
    // not possible, then return -1.
    static int findSplitPoint(int []arr, int n)
    {
     
        int leftSum = 0 ;
     
        // traverse array element
        for (int i = 0; i < n; i++)
        {
             
            // add current element to left Sum
            leftSum += arr[i] ;
     
            // find sum of rest array
            // elements (rightSum)
            int rightSum = 0 ;
             
            for (int j = i+1 ; j < n ; j++ )
                rightSum += arr[j] ;
     
            // split point index
            if (leftSum == rightSum)
                return i+1 ;
        }
 
        // if it is not possible to
        // split array into two parts
        return -1;
    }
 
    // Prints two parts after finding
    // split point using findSplitPoint()
    static void printTwoParts(int []arr, int n)
    {
     
        int splitPoint = findSplitPoint(arr, n);
     
        if (splitPoint == -1 || splitPoint == n )
        {
            Console.Write("Not Possible");
            return;
        }
         
        for (int i = 0; i < n; i++)
        {
            if(splitPoint == i)
            Console.WriteLine();
                 
            Console.Write(arr[i] + " ");
        }
    }
 
    // Driver program
    public static void Main ()
    {
        int []arr = {1 , 2 , 3 , 4 , 5 , 5 };
        int n = arr.Length;
        printTwoParts(arr, n);
    }
}
 
// This code is contributed by nitin mittal


PHP


Javascript


C++
// C++ program to split an array into Two
// equal sum subarrays
#include
using namespace std;
 
// Returns split point. If not possible, then
// return -1.
int findSplitPoint(int arr[], int n)
{
    // traverse array element and compute sum
    // of whole array
    int leftSum = 0;
    for (int i = 0 ; i < n ; i++)
        leftSum += arr[i];
 
    // again traverse array and compute right sum
    // and also check left_sum equal to right
    // sum or not
    int rightSum = 0;
    for (int i=n-1; i >= 0; i--)
    {
        // add current element to right_sum
        rightSum += arr[i];
 
        // exclude current element to the left_sum
        leftSum -=  arr[i] ;
 
        if (rightSum == leftSum)
            return i ;
    }
 
    // if it is not possible to split array
    // into two parts.
    return -1;
}
 
// Prints two parts after finding split point using
// findSplitPoint()
void printTwoParts(int arr[], int n)
{
    int splitPoint = findSplitPoint(arr, n);
 
    if (splitPoint == -1 || splitPoint == n )
    {
        cout << "Not Possible" <


Java
// java program to split an array
// into Two equal sum subarrays
import java.io.*;
 
class GFG {
 
    // Returns split point. If not possible, then
    // return -1.
    static int findSplitPoint(int arr[], int n)
    {
     
    // traverse array element and compute sum
    // of whole array
    int leftSum = 0;
     
    for (int i = 0 ; i < n ; i++)
        leftSum += arr[i];
 
    // again traverse array and compute right
    // sum and also check left_sum equal to
    // right sum or not
    int rightSum = 0;
     
    for (int i = n-1; i >= 0; i--)
    {
        // add current element to right_sum
        rightSum += arr[i];
 
        // exclude current element to the left_sum
        leftSum -= arr[i] ;
 
        if (rightSum == leftSum)
            return i ;
    }
 
    // if it is not possible to split array
    // into two parts.
    return -1;
    }
 
    // Prints two parts after finding split
    // point using findSplitPoint()
    static void printTwoParts(int arr[], int n)
    {
        int splitPoint = findSplitPoint(arr, n);
     
        if (splitPoint == -1 || splitPoint == n )
        {
            System.out.println("Not Possible" );
            return;
        }
        for (int i = 0; i < n; i++)
        {
            if(splitPoint == i)
                System.out.println();
                 
            System.out.print(arr[i] + " ");
        }
    }
 
    // Driver program
    public static void main (String[] args) {
     
    int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
    int n = arr.length;
     
    printTwoParts(arr, n);
         
    }
}
 
// This code is contributed by vt_m


Python3
# Python3 program to split
# an array into Two
# equal sum subarrays
  
# Returns split point.
# If not possible,
# then return -1.
def findSplitPoint(arr, n) :
    # traverse array element and
    # compute sum of whole array
    leftSum = 0
    for i in range(0, n) :
        leftSum += arr[i]
  
    # again traverse array and
    # compute right sum and also
    # check left_sum equal to
    # right sum or not
    rightSum = 0
    for i in range(n-1, -1, -1) :
        # add current element
        # to right_sum
        rightSum += arr[i]
  
        # exclude current element
        # to the left_sum
        leftSum -= arr[i]
  
        if (rightSum == leftSum) :
            return i
  
    # if it is not possible
    # to split array into
    # two parts.
    return -1
  
# Prints two parts after
# finding split point
# using findSplitPoint()
def printTwoParts(arr, n) :
    splitPoint = findSplitPoint(arr, n)
  
    if (splitPoint == -1 or splitPoint == n ) :
        print ("Not Possible")
        return
 
    for i in range (0, n) :
        if(splitPoint == i) :
            print ("")
        print (arr[i], end = " ")        
  
# Driver Code
arr = [1, 2, 3, 4, 5, 5]
n = len(arr)
printTwoParts(arr, n)
  
# This code is contributed by Manish Shaw
# (manishshaw1)


C#
// C# program to split an array
// into Two equal sum subarrays
using System;
  
class GFG {
  
    // Returns split point. If not possible, then
    // return -1.
    static int findSplitPoint(int []arr, int n)
    {
      
    // traverse array element and compute sum
    // of whole array
    int leftSum = 0;
      
    for (int i = 0 ; i < n ; i++)
        leftSum += arr[i];
  
    // again traverse array and compute right
    // sum and also check left_sum equal to
    // right sum or not
    int rightSum = 0;
      
    for (int i = n-1; i >= 0; i--)
    {
        // add current element to right_sum
        rightSum += arr[i];
  
        // exclude current element to the left_sum
        leftSum -= arr[i] ;
  
        if (rightSum == leftSum)
            return i ;
    }
  
    // if it is not possible to split array
    // into two parts.
    return -1;
    }
  
    // Prints two parts after finding split
    // point using findSplitPoint()
    static void printTwoParts(int []arr, int n)
    {
        int splitPoint = findSplitPoint(arr, n);
      
        if (splitPoint == -1 || splitPoint == n )
        {
            Console.Write("Not Possible" );
            return;
        }
        for (int i = 0; i < n; i++)
        {
            if(splitPoint == i)
                 Console.WriteLine();
                  
             Console.Write(arr[i] + " ");
        }
    }
  
    // Driver program
    public static void Main (String[] args) {
      
    int []arr = {1 , 2 , 3 , 4 , 5 , 5 };
    int n = arr.Length;
      
    printTwoParts(arr, n);
          
    }
}
  
// This code is contributed by parashar


PHP
= 0; $i--)
    {
        // add current element
        // to right_sum
        $rightSum += $arr[$i];
 
        // exclude current element
        // to the left_sum
        $leftSum -= $arr[$i] ;
 
        if ($rightSum == $leftSum)
            return $i ;
    }
 
    // if it is not possible
    // to split array into
    // two parts.
    return -1;
}
 
// Prints two parts after
// finding split point
// using findSplitPoint()
function printTwoParts( $arr, $n)
{
    $splitPoint = findSplitPoint($arr, $n);
 
    if ($splitPoint == -1 or
        $splitPoint == $n )
    {
        echo "Not Possible" ;
        return;
    }
    for ( $i = 0; $i < $n; $i++)
    {
        if($splitPoint == $i)
            echo "\n";
        echo $arr[$i] , " " ;
    }
}
 
// Driver Code
$arr = array(1, 2, 3, 4, 5, 5);
$n = count($arr);
printTwoParts($arr, $n);
 
// This code is contributed by anuj_67.
?>


Javascript


输出:

1 2 3 4
5 5 

时间复杂度:O(n 2 )
辅助空间:O(1)
一个有效的解决方案是首先从左到右计算整个数组的总和。现在我们从右边遍历数组并跟踪右和,左和可以通过从整个和中减去当前元素来计算。
下面是上述想法的实现。

C++

// C++ program to split an array into Two
// equal sum subarrays
#include
using namespace std;
 
// Returns split point. If not possible, then
// return -1.
int findSplitPoint(int arr[], int n)
{
    // traverse array element and compute sum
    // of whole array
    int leftSum = 0;
    for (int i = 0 ; i < n ; i++)
        leftSum += arr[i];
 
    // again traverse array and compute right sum
    // and also check left_sum equal to right
    // sum or not
    int rightSum = 0;
    for (int i=n-1; i >= 0; i--)
    {
        // add current element to right_sum
        rightSum += arr[i];
 
        // exclude current element to the left_sum
        leftSum -=  arr[i] ;
 
        if (rightSum == leftSum)
            return i ;
    }
 
    // if it is not possible to split array
    // into two parts.
    return -1;
}
 
// Prints two parts after finding split point using
// findSplitPoint()
void printTwoParts(int arr[], int n)
{
    int splitPoint = findSplitPoint(arr, n);
 
    if (splitPoint == -1 || splitPoint == n )
    {
        cout << "Not Possible" <

Java

// java program to split an array
// into Two equal sum subarrays
import java.io.*;
 
class GFG {
 
    // Returns split point. If not possible, then
    // return -1.
    static int findSplitPoint(int arr[], int n)
    {
     
    // traverse array element and compute sum
    // of whole array
    int leftSum = 0;
     
    for (int i = 0 ; i < n ; i++)
        leftSum += arr[i];
 
    // again traverse array and compute right
    // sum and also check left_sum equal to
    // right sum or not
    int rightSum = 0;
     
    for (int i = n-1; i >= 0; i--)
    {
        // add current element to right_sum
        rightSum += arr[i];
 
        // exclude current element to the left_sum
        leftSum -= arr[i] ;
 
        if (rightSum == leftSum)
            return i ;
    }
 
    // if it is not possible to split array
    // into two parts.
    return -1;
    }
 
    // Prints two parts after finding split
    // point using findSplitPoint()
    static void printTwoParts(int arr[], int n)
    {
        int splitPoint = findSplitPoint(arr, n);
     
        if (splitPoint == -1 || splitPoint == n )
        {
            System.out.println("Not Possible" );
            return;
        }
        for (int i = 0; i < n; i++)
        {
            if(splitPoint == i)
                System.out.println();
                 
            System.out.print(arr[i] + " ");
        }
    }
 
    // Driver program
    public static void main (String[] args) {
     
    int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
    int n = arr.length;
     
    printTwoParts(arr, n);
         
    }
}
 
// This code is contributed by vt_m

Python3

# Python3 program to split
# an array into Two
# equal sum subarrays
  
# Returns split point.
# If not possible,
# then return -1.
def findSplitPoint(arr, n) :
    # traverse array element and
    # compute sum of whole array
    leftSum = 0
    for i in range(0, n) :
        leftSum += arr[i]
  
    # again traverse array and
    # compute right sum and also
    # check left_sum equal to
    # right sum or not
    rightSum = 0
    for i in range(n-1, -1, -1) :
        # add current element
        # to right_sum
        rightSum += arr[i]
  
        # exclude current element
        # to the left_sum
        leftSum -= arr[i]
  
        if (rightSum == leftSum) :
            return i
  
    # if it is not possible
    # to split array into
    # two parts.
    return -1
  
# Prints two parts after
# finding split point
# using findSplitPoint()
def printTwoParts(arr, n) :
    splitPoint = findSplitPoint(arr, n)
  
    if (splitPoint == -1 or splitPoint == n ) :
        print ("Not Possible")
        return
 
    for i in range (0, n) :
        if(splitPoint == i) :
            print ("")
        print (arr[i], end = " ")        
  
# Driver Code
arr = [1, 2, 3, 4, 5, 5]
n = len(arr)
printTwoParts(arr, n)
  
# This code is contributed by Manish Shaw
# (manishshaw1)

C#

// C# program to split an array
// into Two equal sum subarrays
using System;
  
class GFG {
  
    // Returns split point. If not possible, then
    // return -1.
    static int findSplitPoint(int []arr, int n)
    {
      
    // traverse array element and compute sum
    // of whole array
    int leftSum = 0;
      
    for (int i = 0 ; i < n ; i++)
        leftSum += arr[i];
  
    // again traverse array and compute right
    // sum and also check left_sum equal to
    // right sum or not
    int rightSum = 0;
      
    for (int i = n-1; i >= 0; i--)
    {
        // add current element to right_sum
        rightSum += arr[i];
  
        // exclude current element to the left_sum
        leftSum -= arr[i] ;
  
        if (rightSum == leftSum)
            return i ;
    }
  
    // if it is not possible to split array
    // into two parts.
    return -1;
    }
  
    // Prints two parts after finding split
    // point using findSplitPoint()
    static void printTwoParts(int []arr, int n)
    {
        int splitPoint = findSplitPoint(arr, n);
      
        if (splitPoint == -1 || splitPoint == n )
        {
            Console.Write("Not Possible" );
            return;
        }
        for (int i = 0; i < n; i++)
        {
            if(splitPoint == i)
                 Console.WriteLine();
                  
             Console.Write(arr[i] + " ");
        }
    }
  
    // Driver program
    public static void Main (String[] args) {
      
    int []arr = {1 , 2 , 3 , 4 , 5 , 5 };
    int n = arr.Length;
      
    printTwoParts(arr, n);
          
    }
}
  
// This code is contributed by parashar

PHP

= 0; $i--)
    {
        // add current element
        // to right_sum
        $rightSum += $arr[$i];
 
        // exclude current element
        // to the left_sum
        $leftSum -= $arr[$i] ;
 
        if ($rightSum == $leftSum)
            return $i ;
    }
 
    // if it is not possible
    // to split array into
    // two parts.
    return -1;
}
 
// Prints two parts after
// finding split point
// using findSplitPoint()
function printTwoParts( $arr, $n)
{
    $splitPoint = findSplitPoint($arr, $n);
 
    if ($splitPoint == -1 or
        $splitPoint == $n )
    {
        echo "Not Possible" ;
        return;
    }
    for ( $i = 0; $i < $n; $i++)
    {
        if($splitPoint == $i)
            echo "\n";
        echo $arr[$i] , " " ;
    }
}
 
// Driver Code
$arr = array(1, 2, 3, 4, 5, 5);
$n = count($arr);
printTwoParts($arr, $n);
 
// This code is contributed by anuj_67.
?>

Javascript


输出 :

1 2 3 4
5 5