将数组拆分成相等和的相等连续子数组

时间:2020-05-26 15:57:08

标签: javascript arrays algorithm

我想检查是否可以将数组拆分为具有相同总和的连续子数组。拆分数组还意味着删除数组的边框元素。

例如,要将其分为3部分,我们需要将其删除为元素

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

通过删除2个元素,可以得到3个连续的子数组,它们的总和为[2, 4][3, 3][2, 1, 3]

因此,如果有可能将数组分成3个部分(相等的总和)并删除它们之间的边界-它应该返回true,否则应该返回false。

将返回false的示例是[1, 1, 1, 1, 1, 1]。因为在删除2个元素之后,它将有1的4个元素,它们不能分为3个相等的总和

我不知道该如何解决这个问题,任何建议都是有帮助的。

2 个答案:

答案 0 :(得分:2)

您可以从左侧和右侧添加值,如果相等,则得到其余值的总和,并检查该值是否等于一侧。

如果未在左侧添加一个值。

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]));

答案 1 :(得分:2)

我会做这样的事情。

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);

相关问题