【发布时间】:2022-01-25 16:43:35
【问题描述】:
给定一个包含至少 5 个项目的数组 N,我想找到 2 个数字(P 和 Q),其中 0
假设我们有以下数组:
const N = [1, 9, 4, 5, 8];
- 如果 P = 1 , Q = 2 ,则成本将为 N[P] + N[Q] = N[1] + N[2] = 9 + 4 = 13
- 如果 P = 1, Q = 3 ,则成本将为 N[P] + N[Q] = N[1] + N[3] = 9 + 5 = 14
- 如果 P = 2, Q = 3 ,则成本将为 N[P] + N[Q] = N[2] + N[3] = 4 + 5 = 9
从这里得出最低成本的组合是P = 2 和Q = 3。
这是我找到的解决方案,如果我能提高它的时间复杂度,我正在寻求您的帮助:
function solution(N) {
// since 0 < P < Q < N - 1
const sliced = N.slice(1, N.length - 1);
const sorted = sliced.sort((a, b) => a - b);
// the minimum should be from the start since we have sorted the array
const P = 0;
const Q = 1;
return getCost(P, Q, sorted);
}
function getCost(P, Q, N) {
return N[P] + N[Q];
}
// output should be 9
console.log(solution([1, 9, 4, 5, 8]))
在最好的情况下它是 0(n log(n)) 因为排序,但我想知道我们是否可以将其改进为 O(n)。
感谢您的帮助
【问题讨论】:
-
你基本上需要的是数组中两个最小元素的总和? - 应该是
O(N)。对于您的示例,不应该P=0 和Q=2 , sum = 5 而是解决方案吗? -
@Jay 不,它是数组的子集中(第一个和最后一个元素应该排除)中两个最小元素的总和
-
好的,在这种情况下,它将是
N.slice(1, N.length - 1)的两个最小数字的总和。您可以通过跟踪最小和第二小的编号来遍历数组一次。以及到目前为止看到的索引,这将是您的答案。 -
您可以在 O(nlog(k)) 时间内找到数组中的 k 个最小元素。由于这里的 k=2,这是 O(n) 时间。快速选择或使用大小为 k 的堆是两种可能性。对于 k=2,您可以只保留两个变量并在遍历数组时更新它们。
-
@PaulHankin 正如我所说,应该排除第一个和最后一个元素
标签: javascript arrays algorithm performance time-complexity