给定一个数组,如果你可以递归地将它分成两个相等的组,则返回 true

Posted

技术标签:

【中文标题】给定一个数组,如果你可以递归地将它分成两个相等的组,则返回 true【英文标题】:Given an array return true if you can split it to two equal groups recursively 【发布时间】:2022-01-21 07:05:52 【问题描述】:

方法名:

public static boolean equalSplit (int[] a) 

如果您可以将一个数组拆分为两个并且值的总和相等,则返回 true,例如:

-3,5,12,14,-9,13 // returns true -3+5+14 = 12+(-9)+13
-3,5,-12,14,-9,13; //return false,you can split it to two groups but the groups won`t be equal 3+5+14+(-12)=-9+13 
-3,5,12,14,-9; // false because can`t split the array to two

不允许改变数组顺序,只允许递归,不允许循环,私有方法只要 也是递归的。

我写的(代码不完整):

public class Rec

    // private method to find total sum of an array.
    static int findSum(int A[], int N)
    
        if (N <= 0)
            return 0;
        return (findSum(A, N - 1) + A[N - 1]);
        

    
    //
    public static boolean equalSplit (int[] a)
    
      return(equalSplit(a,0,0));   
    
    
    // override
    private static boolean equalSplit (int[] a,int sum,int i) 
    
        int totalSum = findSum(a,a.length); // total sum of the given array.
        if(i > a.length) // run until reach the end of the array.
            return false;
        if(totalSum - sum == sum) // if subtracting the recursive sum from total sum gives equal number return true
            return true;
   
        int take = equalSplit(a,sum + a[i] , i+1); // boolean cannot be convereted to int
        

我正在尝试做的事情: 我使用了一种私有方法来查找整个数组的总和,然后从总和中减去。假设逐步对数组求和的 main 方法中的求和。我的问题是该方法是布尔方法,我不知道如何递归地使用布尔方法 完成它。

我的问题: 你能告诉我结构好不好?我应该如何处理它?

【问题讨论】:

所以这不是将数组分成两个特定索引之间的两个连续组,而是从数组中选择两个不相交的集合,从示例 1 来看? 如果不应该更改订单,例如 1,如何添加 -3、5 和 14? 对不起,如果我不清楚,意思是:如果您可以将数组单元拆分为大小相同的两个不同组并且它们的总和也相等 @anton5450 请编辑您的问题。您说不允许更改数组顺序,但看起来允许更改顺序 【参考方案1】:

这是一个不使用循环且不更改顺序的解决方案,

static int[] arrA, arrB;
    public static boolean equalSplit(int[] arr) 
        //Step 1
        if (arr.length % 2 == 0) 
            int sumA = 0, sumB = 0; // Two int variables to store the value of sum.

            // Initializing the two new arrays with equal length.
            arrA = new int[arr.length / 2]; 
            arrB = new int[arr.length / 2];

            // Copying the elements from the given array to the new arrays.
            arrA = createArray(arrA, 0, arr, 0);
            arrB = createArray(arrB, 0, arr, arr.length / 2);

            //Calculating and storing the sum in the variables.
            sumA = arraySum(arrA, arrA.length);
            sumB = arraySum(arrB, arrB.length);

            return sumA == sumB; // Checking the codition

         else 
            return false;
        
    

    private static int[] createArray(int[] arr, int index, int[] copyFrom, int copyFromIndex) 
        if(index == arr.length) return arr;
        arr[index] = copyFrom[copyFromIndex];
        index++;
        copyFromIndex++;
        return createArray(arr, index, copyFrom, copyFromIndex);
    

    private static int arraySum(int[] arr, int N) 
        if (N <= 0) return 0;
        return (arraySum(arr, N - 1) + arr[N - 1]);
     

我对这个问题的看法是,

第 1 步 -> 检查是否可以将给定数组拆分为两个相等的数组。如果是,接下来是第 2 步,或者返回 false 没有任何进一步的步骤。

第 2 步 -> 使用递归将给定的数组元素复制到两个不同但相等的数组中。

第 3 步 -> 对新填充的两个数组求和并将其存储在两个不同的变量中。

第 4 步 -> 如果两个新填充的数组的总和相等,则函数返回 true,否则返回 false。

解释:

创建两个仅用于填充的新整数数组 如果给定的数组可以分成两个相等的部分。这里是 arrAarrB

检查给定数组的长度是否可以被2整除并且余数为0,因为这可以回答“这个数组可以分为两个相等的部分吗?”这个问题。此答案中的代码是arr.length % 2 == 0。如果给定的数组仅满足此条件,则将执行下面给出的步骤,否则将返回 false。

初始化两个整型变量,存储两个等分数组的Sum值。

初始化两个新创建的数组,数组长度为给定数组的一半,即arr.length / 2

然后将给定数组元素的前半部分复制到第一个新初始化的数组,然后将后半部分复制到第二个数组。为了实现这个createArray(int[] arr, int index, int[] copyFrom, int copyFromIndex) 方法被使用。 arr 是传递要复制到的数组的参数,index 应该为 0,因为它用作新创建的数组的索引,copyFrom 是给定数组的参数,其中包含所有元素,copyFromIndex 用于开始复制给定索引中的元素。

然后使用递归函数计算总和并将其存储在之前创建的单独变量中。这里使用的函数是arraySum(int[] arr, int N)

返回两个总和变量是否相等。

【讨论】:

首先谢谢你的帮助,你能解释一下你做了什么吗? 这个解释让你明白了吗? 但实际上根据您给定的第一个示例,您已经更改了顺序。因此,如果您必须这样做,那么这将无法解决。我假设这不是它的工作原理。 我没有t change the array order,the only thing that been changed is the order im 为每个组选择数字,我可能搞砸了我解释它的方式,谢谢

以上是关于给定一个数组,如果你可以递归地将它分成两个相等的组,则返回 true的主要内容,如果未能解决你的问题,请参考以下文章

将数组分成和相等的三个部分(LeetCode 1013)

排序算法总结之归并排序

递归打卡1在两个长度相等的排序数组中找到上中位数

递归和动态规划——Knapsack

Ebay 面试题 | 把数组分成和大小一样的集合

分治算法解最大子序列和问题