有一个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]。
所以最小金额为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)
答案 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]才会发生。在最大值,它可能会在排序的数组中间一直到中断。并且记得在完成后打破循环。
我希望这符合你的目的!