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

前端 未结 22 1057
一生所求
一生所求 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:02

    This is a recursive solution to the problem, one non recursive solution could use a helper method to get the sum of indexes 0 to a current index in a for loop and another one could get the sum of all the elements from the same current index to the end, which works. Now if you wanted to get the elements into an array and compare the sum, first find the point (index) which marks the spilt where both side's sum are equal, then get a list and add the values before that index and another list to go after that index.

    Here's mine (recursion), which only determines if there is a place to split the array so that the sum of the numbers on one side is equal to the sum of the numbers on the other side. Worry about indexOutOfBounds, which can easily happen in recursion, a slight mistake could prove fatal and yield a lot of exceptions and errors.

    public boolean canBalance(int[] nums) {
      return (nums.length <= 1) ? false : canBalanceRecur(nums, 0);   
    }
    public boolean canBalanceRecur(int[] nums, int index){ //recursive version
      if(index == nums.length - 1 && recurSumBeforeIndex(nums, 0, index) 
      != sumAfterIndex(nums, index)){ //if we get here and its still bad
      return false;
      }
      if(recurSumBeforeIndex(nums, 0, index + 1) == sumAfterIndex(nums, index + 1)){
      return true;
      }
      return canBalanceRecur(nums, index + 1); //move the index up
    }
    public int recurSumBeforeIndex(int[] nums, int start, int index){
       return (start == index - 1 && start < nums.length) 
       ? nums[start] 
       : nums[start] + recurSumBeforeIndex(nums, start + 1, index);
    }
    
    public int sumAfterIndex(int[] nums, int startIndex){
      return (startIndex == nums.length - 1) 
      ? nums[nums.length - 1] 
      : nums[startIndex] + sumAfterIndex(nums, startIndex + 1);
    }
    

提交回复
热议问题