【问题标题】:Javascript: Take two numbers from an array and divide the array into three subarrays. Find the minimum sum of the two numbersJavascript:从一个数组中取出两个数字并将该数组分成三个子数组。求两个数的最小和
【发布时间】:2017-10-16 12:44:24
【问题描述】:

有一个由 N 个整数组成的数组。我们将从数组中取出两个数字并将这个数组分成三部分。准确地说,我们将在索引 P 和 Q 处获取元素。子数组的索引将是 [0, P-1], [P+1, Q-1], [Q+1, N-1]。显然,0 1。我们要求两个数之和的最小。

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

  • 索引 1 和 3。总和为 8
  • 索引 1 和 4。总和为 5。
  • 指数 2 和 4。总和为 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)

【问题讨论】:

  • 这是一个家庭作业。自己试试
  • 请展示您尝试过的内容。 Stackoverflow 不是免费的代码编写或教程服务。目标是帮助您修复您的代码
  • @charlietfl 我自己试过了。显然它不是世界上最快的算法。
  • 这样有效吗?具体是什么问题?
  • 并不是说这会影响运行速度,但是您可以使用Number.MAX_VALUENumber.MAX_SAFE_INTEGER 而不是硬编码的2000000000,并且其意图更加清晰。

标签: javascript arrays algorithm


【解决方案1】:

与您的算法相比,这是一个应该有效且时间复杂度更高的算法。

如果 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]。最大时,它可能会通过排序数组的一半直到它中断。完成后记得打破循环。

我希望这能达到您的目的!

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多