How to optimally divide an array into two subarrays so that sum of elements in both are same, otherwise give an error?

前端 未结 22 861
一生所求
一生所求 2020-12-02 11:20

How to optimally divide an array into two subarrays so that sum of elements in both subarrays is same, otherwise give an error?

Example 1

Given the array

相关标签:
22条回答
  • 2020-12-02 12:13
        public boolean splitBetween(int[] x){
        int sum=0;
        int sum1=0;
        if (x.length==1){
            System.out.println("Not a valid value");
        }
    
        for (int i=0;i<x.length;i++){
            sum=sum+x[i];
            System.out.println(sum);
            for (int j=i+1;j<x.length;j++){
                sum1=sum1+x[j];
                System.out.println("SUm1:"+sum1);
    
            }
    
            if(sum==sum1){
                System.out.println("split possible");
                System.out.println("Sum: " +sum +" Sum1:" + sum1);
                return true;
            }else{
                System.out.println("Split not possible");
            }
    
            sum1=0;
        }
        return false;   
    }
    
    0 讨论(0)
  • 2020-12-02 12:17

    I was asked this question in an interview, and I gave below simple solution, as I had NOT seen this problem in any websiteS earlier.

    Lets say Array A = {45,10,10,10,10,5} Then, the split will be at index = 1 (0-based index) so that we have two equal sum set {45} and {10,10,10,10,5}

    int leftSum = A[0], rightSum = A[A.length - 1];
    int currentLeftIndex = 0; currentRightIndex = A.length - 1
    

    /* Move the two index pointers towards mid of the array untill currentRightIndex != currentLeftIndex. Increase leftIndex if sum of left elements is still less than or equal to sum of elements in right of 'rightIndex'.At the end,check if leftSum == rightSum. If true, we got the index as currentLeftIndex+1(or simply currentRightIndex, as currentRightIndex will be equal to currentLeftIndex+1 in this case). */

    while (currentLeftIndex < currentRightIndex)
    {
    if ( currentLeftIndex+1 != currentRightIndex && (leftSum + A[currentLeftIndex + 1)     <=currentRightSum )
    {
     currentLeftIndex ++;
     leftSum = leftSum + A[currentLeftIndex];
    }
    
    
    if ( currentRightIndex - 1 != currentLeftIndex && (rightSum + A[currentRightIndex - 1] <= currentLeftSum)
    {
     currentRightIndex --;
     rightSum = rightSum + A[currentRightIndex];
    }
    
    }
    
    if (CurrentLeftIndex == currentRightIndex - 1 && leftSum == rightSum)
    PRINT("got split point at index "+currentRightIndex);
    
    0 讨论(0)
  • 2020-12-02 12:19

    Tried a different solution . other than Wiki solutions (Partition Problem).

    static void subSet(int array[]) {
        System.out.println("Input elements  :" + Arrays.toString(array));
    
        int sum = 0;
        for (int element : array) {
            sum = sum + element;
        }
        if (sum % 2 == 1) {
            System.out.println("Invalid Pair");
            return;
        }
    
        Arrays.sort(array);
        System.out.println("Sorted elements :" + Arrays.toString(array));
    
        int subSum = sum / 2;
    
        int[] subSet = new int[array.length];
        int tmpSum = 0;
        boolean isFastpath = true;
        int lastStopIndex = 0;
        for (int j = array.length - 1; j >= 0; j--) {
            tmpSum = tmpSum + array[j];
            if (tmpSum == subSum) { // if Match found
                if (isFastpath) { // if no skip required and straight forward
                                    // method
                    System.out.println("Found SubSets 0..." + (j - 1) + " and "
                            + j + "..." + (array.length - 1));
                } else {
                    subSet[j] = array[j];
                    array[j] = 0;
                    System.out.println("Found..");
                    System.out.println("Set 1" + Arrays.toString(subSet));
                    System.out.println("Set 2" + Arrays.toString(array));
                }
                return;
            } else {
                // Either the tmpSum greater than subSum or less .
                // if less , just look for next item
                if (tmpSum < subSum && ((subSum - tmpSum) >= array[0])) {
                    if (lastStopIndex > j && subSet[lastStopIndex] == 0) {
                        subSet[lastStopIndex] = array[lastStopIndex];
                        array[lastStopIndex] = 0;
                    }
                    lastStopIndex = j;
                    continue;
                }
                isFastpath = false;
                if (subSet[lastStopIndex] == 0) {
                    subSet[lastStopIndex] = array[lastStopIndex];
                    array[lastStopIndex] = 0;
                }
                tmpSum = tmpSum - array[j];
            }
        }
    
    }
    

    I have tested. ( It works well with positive number greater than 0) please let me know if any one face issue.

    0 讨论(0)
  • 2020-12-02 12:19

    A BAD greedy heuristic to solve this problem: try sorting the list from least to greatest, and split that list into two by having list1 = the odd elements, and list2 = the even elements.

    0 讨论(0)
提交回复
热议问题