【发布时间】:2021-02-17 06:02:26
【问题描述】:
我一直在尝试解决 1H30 的这个代码问题,以及如何使用二分搜索来解决。我找到了答案,但我无法理解其背后的逻辑。知道的人可以告诉我这个答案吗?
这是问题
任务描述
给定整数 K、M 和一个非空的零索引数组 A 由 N 个整数组成。数组的每个元素都不大于 比 M.
你应该把这个数组分成K个连续元素的块。 块的大小是 0 到 N 之间的任意整数。 数组应该属于某个块。
从 X 到 Y 的块之和等于 A[X] + A[X + 1] + ... + A[Y]。 空块之和等于0。
大和是任何块的最大和。
例如,给定整数 K = 3、M = 5 和数组 A 这样 那:
A[0] = 2 A[1] = 1 A[2] = 5 A[3] = 1 A[4] = 2 A[5] = 2
A[6] = 2数组可以分为例如以下几个块:
[2, 1, 5, 1, 2, 2, 2], [], [] 大和为 15; [2], [1, 5, 1, 2], [2, 2] 的和为 9; [2, 1, 5], [], [1, 2, 2, 2] 与 8 大笔款项; [2, 1], [5, 1], [2, 2, 2] 的和为 6。
目标是尽量减少大额金额。在上面的例子中,6 是 最小的大金额。
写一个函数:
函数解(K, M, A);
给定整数 K、M 和一个非空的零索引数组 A 由 N 个整数组成,返回最小的大和。
例如,给定 K = 3、M = 5 和数组 A 使得:
A[0] = 2 A[1] = 1 A[2] = 5 A[3] = 1 A[4] = 2 A[5] = 2
A[6] = 2该函数应返回 6,如上所述。
假设:
N 和 K 是 [1..100,000] 范围内的整数; M 是 [0..10,000] 范围内的整数; 数组 A 的每个元素都是 [0..M] 范围内的整数。
这是我可以得到的答案
function solution(K, M, A) {
var begin = A.reduce((a, v) => (a + v), 0)
begin = parseInt((begin+K-1)/K, 10);
var maxA = Math.max(A);
if (maxA > begin) begin = maxA;
var end = begin + M + 1;
var res = 0;
while(begin <= end) {
var mid = (begin + end) / 2;
var sum = 0;
var block = 1;
for (var ind in A) {
var a = A[ind];
sum += a;
if (sum > mid) {
++block;
if (block > K) break;
sum = a;
}
}
if (block > K) {
begin = mid + 1;
} else {
res = mid;
end = mid - 1;
}
}
return res;
}
【问题讨论】:
标签: javascript algorithm binary-search-tree