Разбить массив на равные непрерывные подмассивы с одинаковой суммой - PullRequest
1 голос
/ 26 мая 2020

Я хочу проверить, можно ли разбить массив на смежные подмассивы с одинаковой суммой. Разделение массива означает также удаление из него граничных элементов.

Например, чтобы разделить его на 3 части, нам нужно удалить элементы

myArray = [2, 4, 5, 3, 3, 3, 2, 1, 3]
                 ^        ^

, удалив эти 2 элемента, которые есть 3 смежных подмассива с одинаковой суммой [2, 4], [3, 3] и [2, 1, 3].

Итак, если можно разделить массив на 3 части (с равной суммой) и удалить границы между ними - он должен вернуть true, иначе он должен вернуть false.

Пример, который бы return false равен [1, 1, 1, 1, 1, 1]. Поскольку после удаления 2 элементов у него будет 4 элемента 1, которые нельзя сгруппировать в 3 равные суммы

Я не знаю, как подойти к этой проблеме, любое предложение полезно.

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Я бы сделал что-то вроде этого.

myArray = [2, 4, 5, 3, 3, 3, 2, 1, 3];
var x = []; //result if sub-arrays

var i = 0;

while(i< myArray.length-3){
 x.push([myArray[i],myArray[i+1]])
  i = i+3;
  
};


var a =[]; //remaining element
for(var k =i; k<myArray.length;k++){
   a.push(myArray[k]);

}
 x.push(a)

console.log(x);
var sum =x[0].reduce((a, b) => a + b, 0);
var returnTrue = true;
for(var k=1; k<x.length; k++){
  var sumAnother = x[k].reduce((a, b) => a + b, 0);
  if(sumAnother!== sum){
    returnTrue = false;
    break;
  }
}

console.log(returnTrue);
2 голосов
/ 26 мая 2020

Вы можете сложить значения слева и справа и, если они равны, получить сумму остальных и проверить, равно ли это значение одной из сторон.

Если нет, добавьте одно значение в левую сторону .

function check(array) {
    var i = 0,
        j = array.length - 1,
        left = array[i++],
        right = array[j--];

    while (i < j) {
        if (left < right) { left += array[i++]; continue; }
        if (left > right) { right += array[j--]; continue; }
        if (array.slice(i + 1, j).reduce((a, b) => a + b, 0) === left) return true;
        left += array[i++];
    }
    return false;
}

console.log(check([2, 4, 5, 3, 3, 3, 2, 1, 3]));
console.log(check([1, 1, 1, 1, 1, 1]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...