繁体   English   中英

算法:给定一个数组,求重排后的最大和

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM