【问题标题】:Split an array into equal contiguous subarrays of equal sum将一个数组拆分为相等和的相等连续子数组
【发布时间】:2020-09-13 12:03:09
【问题描述】:

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

例如,要将其拆分为 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 个元素后,它将有 4 个 1 元素,它们不能被分组为 3 个相等的总和

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

【问题讨论】:

  • 您要获取true 还是新数组?你还有其他例子吗?
  • @NinaScholz 如果我描述的操作可以在该输入数组中完成,我想获得true。我添加了一个应该返回 false 的示例
  • 可以删除多少元素?只有2个?
  • @Soham 是的,只有 2 个。并且这 2 个元素必须是新创建的子数组的边界,就像我在问题中写的第一个示例一样
  • 没有运行时复杂性要求或内存限制,有一个超级简单的答案,那就是“尝试所有排列并在找到单​​个有效分段时返回 true”。因此,在人们尝试回答您之前:您是否首先实现了它,看看它是否满足您的需求而不是一般? (毕竟,对于短输入,高阶复杂度通常仍然足够快)

标签: javascript arrays algorithm


【解决方案1】:

我会做这样的事情。

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】:

    您可以将左侧和右侧的值相加,如果相等,则获取其余部分的总和,并检查该值是否等于一侧。

    如果不向左侧添加一个值。

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

    【讨论】:

    • 当我读到这个问题时,op 总是想要三个部分和两个元素来分隔组。
    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 2017-04-15
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多