Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find all subarray with sum equal to number?

Tags:

javascript

Could you please tell me how to find all subarray with sum equal to number Example

arr[] = [2, 4, 45, 6, 0, 19]
   x  =  51
Output: [2,4,45]

Or

arr[] = [1, 11, 100, 1, 0, 200, 3, 2, 1, 280]
    x = 280
Output: [280]

I tried like that but not getting correct output

function getSubArray(arr, num) {
  var sum = 0,
    blank = [];
  var bigArr = []
  for (var i = 0; i < arr.length; i++) {
    sum = arr[i];
    if (blank.length === 0) {
      blank.push(arr[i]);
    }
    for (var j = 1; i < arr.length; j++) {
      sum += arr[j];
      if (sum < num) {
        blank.push(arr[j])
      } else if (sum > num) {
        sum = 0;
        blank = [];
        break;
      } else {
        blank.push(arr[j])
        bigArr.push(blank);
        sum = 0;
        blank = [];
      }
    }
  }

  return bigArr
}

console.log(getSubArray([1, 3, 6, 11, 1, 5, 4], 4));

for this expected output is

console.log(getSubArray([1, 3, 6, 11, 1, 5,4],4));

output: [1,3]
     [4]

expected output [[1,3], [4]] is my expected output

like image 988
user944513 Avatar asked Mar 22 '19 09:03

user944513


People also ask

How do you find the number of subarrays with the sum of 0?

If there is another subarray starting from index 0 and ending at index 5 has a sum of 10. Then the sum of elements from index 3 to index 5 should be 0. In this way, we can find the number of subarrays having sum 0 by using the hashmap.

How do you find the number of subarrays in an array?

The total number of subarrays in an array of size N is N * (N + 1) / 2. The count of subarrays with an odd product is equal to the total number of continuous odd elements present in the array. Therefore, count of subarrays with even product = (Total number of subarrays – Subarrays with the odd product).


2 Answers

You could iterate the array and take either the next element or if no element is taken before omit this element.

function getSubset(array, sum) {
    function iter(temp, delta, index) {
        if (!delta) result.push(temp);
        if (index >= array.length) return;
        iter(temp.concat(array[index]), delta - array[index], index + 1);
        if (!temp.length) iter(temp, delta, index + 1);
    }

    var result = [];
    iter([], sum, 0);
    return result;
}

console.log(getSubset([2, 4, 45, 6, 0, 19], 51));                   // [2, 4, 45], [45, 6], [45, 6, 0]
console.log(getSubset([1, 11, 100, 1, 0, 200, 3, 2, 1, 280], 280)); // [280]
console.log(getSubset([1, 3, 6, 11, 1, 5, 4], 4));                  // [1, 3], [4]
like image 143
Nina Scholz Avatar answered Sep 22 '22 10:09

Nina Scholz


This might not be exactly what's needed - might require tweaking as the logic may be flawed here.

I have commented the code for clarification.

var arr = [1, 3, 6, 11, 1, 5,4];	//  Define array

var target = 31;	//  Define target

//  filter the numbers higher than target and sort rest ascending
var withinRange = arr.filter(x => x <= target).sort((a, b) => a - b);
                      
if(arr.reduce((a,b) => a + b) < target)	//  Check if we have enough numbers to make up that number
  throw "The max you can get out of your selection is: " + arr.reduce((a,b) => a + b);
                      
//  grab the highest number as a starting point and remove it from our array of numbers
var numbers = [withinRange.pop()];

var toFind = target - getSum();	//  get remainder to find

for(var i = withinRange.length - 1; i > -1; i--)	//  iterate from the top
{

  if(toFind == withinRange[i]){	//  check if number is exactly what we need
    numbers.push(withinRange[i]);
    break;
  }else if(withinRange[i] <= toFind){	//  if number is smaller than what we look for
    numbers.push(withinRange[i]);
    toFind -= withinRange[i];
  }

}

function getSum(){	//  sum up our found numbers
  if(numbers.length == 0) return 0;
  return numbers.reduce((a,b) => a + b);
}

console.log([numbers, [target]]);	//  print numbers as desired output
console.log(target, getSum())	//  print the target and our numbers
like image 45
Adrian Avatar answered Sep 18 '22 10:09

Adrian