将数组拆分为两个等额子数组

给定一个大于零的整数数组,找出是否可以将其拆分为两个子数组(无需对元素重新排序),从而使两个子数组之和相同。打印两个子阵列。 例如:

null
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

被问到: Facebook采访

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

C++

// C++ program to split an array into Two
// equal sum subarrays
#include<bits/stdc++.h>
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" <<endl;
return ;
}
for ( int i = 0; i < n; i++)
{
if (splitPoint == i)
cout << endl;
cout << arr[i] << " " ;
}
}
// driver program
int main()
{
int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
int n = sizeof (arr)/ sizeof (arr[0]);
printTwoParts(arr, n);
return 0;
}


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

<?php
// PHP program to split
// an array into Two
// equal sum subarrays
// Returns split point.
// If not possible, then
// return -1.
function findSplitPoint( $arr , $n )
{
$leftSum = 0 ;
// traverse array element
for ( $i = 0; $i < $n ; $i ++)
{
// add current element
// to left Sum
$leftSum += $arr [ $i ] ;
// find sum of rest array
// elements (rightSum)
$rightSum = 0 ;
for ( $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()
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 "" ;
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

<script>
// Java script program to split an array
// into two equal sum subarrays
// Returns split point. If
// not possible, then return -1.
function findSplitPoint(arr,n)
{
let leftSum = 0 ;
// traverse array element
for (let i = 0; i < n; i++)
{
// add current element to left Sum
leftSum += arr[i] ;
// find sum of rest array
// elements (rightSum)
let rightSum = 0 ;
for (let 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()
function printTwoParts(arr,n)
{
let splitPoint = findSplitPoint(arr, n);
if (splitPoint == -1 || splitPoint == n )
{
document.write( "Not Possible" );
return ;
}
for (let i = 0; i < n; i++)
{
if (splitPoint == i)
document.write( "<br>" );
document.write(arr[i] + " " );
}
}
// Driver program
let arr = [1 , 2 , 3 , 4 , 5 , 5 ];
let n = arr.length;
printTwoParts(arr, n);
// contributed by sravan kumar
</script>


输出:

1 2 3 45 5 

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

C++

// C++ program to split an array into Two
// equal sum subarrays
#include<bits/stdc++.h>
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" <<endl;
return ;
}
for ( int i = 0; i < n; i++)
{
if (splitPoint == i)
cout << endl;
cout << arr[i] << " " ;
}
}
// driver program
int main()
{
int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
int n = sizeof (arr)/ sizeof (arr[0]);
printTwoParts(arr, n);
return 0;
}


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

<?php
// PHP program to split
// an array into Two
// equal sum subarrays
// Returns split point.
// If not possible,
// then return -1.
function findSplitPoint( $arr , $n )
{
// traverse array element and
// compute sum of whole array
$leftSum = 0;
for ( $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
$rightSum = 0;
for ( $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()
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 "" ;
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

<script>
// Javascript program to split an array
// into Two equal sum subarrays
// Returns split point. If not possible, then
// return -1.
function findSplitPoint(arr, n)
{
// traverse array element and compute sum
// of whole array
let leftSum = 0;
for (let 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
let rightSum = 0;
for (let 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()
function printTwoParts(arr, n)
{
let splitPoint = findSplitPoint(arr, n);
if (splitPoint == -1 || splitPoint == n )
{
document.write( "Not Possible" );
return ;
}
for (let i = 0; i < n; i++)
{
if (splitPoint == i)
document.write( "</br>" );
document.write(arr[i] + " " );
}
}
let arr = [1 , 2 , 3 , 4 , 5 , 5 ];
let n = arr.length;
printTwoParts(arr, n);
// This code is contributed by rameshtravel07.
</script>


输出:

1 2 3 45 5 

时间复杂性: O(n) 辅助空间: O(1) 本文由 尼桑·辛格 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享