[英]Algorithm: Given an array, find the maximum sum after rearrangement
给定一个数组 A,大小为 N,包含从 0 到 N 的数字。 对于从第 0 个索引开始的每个子数组,假设 Si,我们说 Bi 是 Si 中不存在的最小非负数。
我们需要找到这个数组的所有 Bi 的最大可能和。
我们可以重新排列数组以获得最大和。
例如:
A = 1, 2, 0, N = 3
然后假设我们将其重新排列为 A= 0, 1, 2
S1 = 0, B1= 1
S2 = 0,1 B2= 2
S3 = 0,1,2 B3= 3
因此总和是 6
无论我尝试过什么示例,我都看到排序后的数组将给出最大的总和。 我在这里是正确还是遗漏了什么。
请帮助找到此问题的正确逻辑。 我不是在寻找最佳解决方案,而只是在寻找正确的逻辑。
是的,对数组进行排序会使 𝐵 𝑖的总和最大化
由于输入大小为 𝑛,它不包括 {0,..., 𝑛} 范围内的每个数字,因为这是一组 𝑛 + 1 个数字。 假设它只缺少价值 𝑘,那么 𝐵 𝑖对于所有 𝑖 >= 𝑘 都是 𝑘。 如果缺少其他数字,但大于 𝑘,则对任何 𝐵 𝑖没有影响。
因此,我们需要在 {0,..., 𝑛} 范围内找出最小缺失值 𝑘。 然后最大的和是 1 + 2 +... + 𝑘 + (𝑛−𝑘)𝑘。 这是𝑘(𝑘+1)/2 + (𝑛−𝑘)𝑘 = 𝑘(1 + 2𝑛 - 𝑘)/2
要找到 𝑘 的值,请创建大小为 𝑛 + 1 的 boolean 数组,并在输入中遇到 𝑣 时将索引 𝑣 处的条目设置为 true。 𝑘 是 boolean 数组仍然具有错误值的第一个索引。
这是 JavaScript 片段中的一个小实现:
function maxSum(arr) { const n = arr.length; const isUsed = Array(n + 1).fill(false); for (const value of arr) { isUsed[value] = true; } const k = isUsed.indexOf(false); return k * (1 + 2*n - k) / 2; } console.log(maxSum([0, 1, 2])); // 6 console.log(maxSum([0, 2, 2])); // 3 console.log(maxSum([1, 0, 1])); // 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.