当前位置: 首页 > 知识库问答 >
问题:

在O(nlogn)时间复杂度中找到和为0的子数组(使用分治)?

姬昊焱
2023-03-14

输入数组只有1和-1,算法将找到一个和为0的子数组。

输入={1,1,-1,1,-1,-1,-1,-1}

输出=1,8(1是起始索引,8是最后索引)

唯一的约束是算法不能使用任何辅助数据结构。在这个约束条件下,解决方案必须是最有效的。此外,还允许使用递归。

共有1个答案

裴翰学
2023-03-14

您可以使用递归算法,其中函数获取前一个数组值(如果有)的值,然后从输入数组中读取下一个值。如果是相同的值,那么它会递归地调用自己,当从那里返回时,它会以同样的方式继续下一个值。如果是相反的值,则返回给调用方true--以指示存在零和。如果遇到数组末尾,则函数返回false

这实际上意味着递归的深度等于绝对累计和。例如,如果数组是[-1,-1,-1,1],那么递归将进入深度3,它将从级别3返回到级别2,返回值true。在第2级,它将返回false,因为它遇到了数组的末尾,因此它将退出递归。

只要返回值为true,您就可以检查覆盖的间隔是否比目前遇到的大。

function zeroSum(arr) {
  let i = 0; // index in the input array, managed outside of recursion
  // Longest zero-sum interval so far. Zero based, and value at end index 
  //   is not part of the interval:
  let longest = [0, 0];

  function recur(dir) { // dir is the previous value from the array (if any)
    let start = i; // local variable
    while (i < arr.length) {
      let val = arr[i++];
      if (val == -dir) return true; // zero sum
      if (recur(val) && i - start > longest[1] - longest[0]) {
        longest[0] = start;
        longest[1] = i;
      }
    }
    return false; // no zero sum
  }

  recur(0); // 0 is passed to indicate there is no previous value
  return longest;
}

// demo
console.log(zeroSum([1, 1, -1, 1, -1, -1, 1, -1]));
 类似资料:
  • 就像谷歌地图一样,给定一百万个经纬度坐标列表,你将如何打印距离给定位置最近的k个城市? 我在一次面试中问了这个问题。面试官说这可以在O(n)中通过使用插入排序到k来完成,而不是对整个列表进行排序,即NlogN。我在网上找到了其他答案,大多数人都说NLogN...他[面试官]正确吗?

  • 下面给出了问题陈述和解决方案。我无法理解解决方案背后的逻辑。 问题陈述: 给定一个数组包含n+1个整数,其中每个整数介于1和n之间,证明至少存在一个重复的数字。假设只有一个重复的数字,找到重复的一个。 首先,搜索空间是1到n之间的数字。每次我选择一个数字mid(它是中间的那个),并计算所有等于或小于mid的数字。如果计数大于mid,则搜索空间为[1 mid],否则为[mid+1n]。我这样做,直到

  • 问题内容: 我打算对StringBuilders中的最后一个字符进行很多删除。使用的解决方案对我来说很好。但是,由于这些删除将处于循环中,因此我需要知道其复杂性。 据我了解,该操作只是减少了StringBuilder对象的一些私有属性,并且不对字符本身执行任何复制/克隆/复制操作,因此它的时间为O(1),应该可以快速运行。 我对吗? 问题答案: 从文档中: 设置字符序列的长度。序列更改为新的字符序

  • 主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内

  • 我写了一个函数来寻找目标值在给定数组中应该插入的位置。我们假设数组有不同的值,并按升序排序。我的解必须是O(log N)时间复杂度 此代码的复杂性是否为O(log N)?

  • 我编写了以下代码,用于在BST中查找相加为0的三元组。但很难确定时间复杂度。 find()方法的时间复杂度为O(logn)。isTriplet()的时间复杂度是O(n^2)吗?