Javascript:从数组中取两个数字并将数组分成三个子数组。找到两个数字的最小总和

时间:2017-10-16 12:44:25

标签: javascript arrays algorithm

有一个N个整数数组。我们将从数组中取两个数字并将此数组拆分为三个部分。确切地说,我们将采用索引P和Q处的元素。并且子阵列&#39;指数将是[0,P-1],[P + 1,Q-1],[Q + 1,N-1]。显然,0 <0。 P&lt; Q&lt; N-1,Q-P>我们希望找到两个数字的最小总和。

例如,我们可以通过三种方式从数组中获取两个数字[5,2,4,6,3,7]。

  • 指数1&amp;总和是8
  • 指数1&amp;这笔钱是5。
  • 指数2&amp;这笔钱是7。

所以最小金额为5。

我已经尝试并编写了以下函数来实现此效果。显然它很慢。但我想不出一种编写更快算法的方法。

const arrayOne = [5, 2, 4, 6, 3, 7]
console.log(arrayOne)

const breakChain = (arr) => {
 let lowest = 2000000000
 for (let open = 1; open < arr.length - 3; open ++) {
  for (let close = open + 2; close < arr.length - 1; close ++) {
   const low = arr[open] + arr[close]
   if (low < lowest) {
    lowest = low
   }
  }
 }
 console.log(lowest)
}

breakChain(arrayOne)

1 个答案:

答案 0 :(得分:0)

这是一个应该有效的算法,与你的相比,它具有更好的时间复杂度。

如果arr []以某种顺序存储您的号码,那么使用一个好的排序算法(您可以在线谷歌),按升序存储它们。我们将它们存储在arr1 []。

现在,如果arr1 [0] \ neq arr [0] \ neq arr [n],则arr1 [0]和arr [1]产生最小的和。另外,arr1 [1] \ neq arr [i + - 1]和arr [1] \ neq arr [0]或arr [n]。使用二进制搜索来检查条件。

如果这些条件在arr1 [0],arr1 [1]之间不成立,则检查arr1 [1],arr1 [2],依此类推。请注意,直到arr1 [n]才会发生。在最大值,它可能会在排序的数组中间一直到中断。并且记得在完成后打破循环。

我希望这符合你的目的!