【发布时间】:2018-01-03 19:05:08
【问题描述】:
我正在阅读极客网站上的this 问题。
问题是关于找出数组中的最小移动次数,以便所有元素都相等。
给定一个由 n 个元素组成的数组。在每次操作中,您 可以选择任何一个元素并将其余 n-1 个元素增加 1。你 必须使所有元素平等地执行这样的操作 你希望的时间。找出为此所需的最少操作数。
Examples:
Input : arr[] = {1, 2, 3}
Output : Minimum Operation = 3
Explanation :
operation | increased elements | after increment
1 | 1, 2 | 2, 3, 3
2 | 1, 2 | 3, 4, 3
3 | 1, 3 | 4, 4, 4
Input : arr[] = {4, 3, 4}
Output : Minimum Operation = 2
Explanation :
operation | increased elements | after increment
1 | 1, 2 | 5, 4, 4
2 | 2, 3 | 5, 5, 5
链接说明我们必须使用公式minOperation = sum - (n * small) 来得到答案,其中 sum 是数组中所有元素的总和,n 是数组中元素的数量,small 是数组中的最小元素。
你能帮我理解一下minOperation = sum - (n * small)这个公式的含义吗?以及它是如何解决问题的?
【问题讨论】:
-
这和Java有什么关系?如果是这样,则您的索引全部减一。
-
想想数组的条形图,其中
sum是阴影部分的面积。n*small是由最小元素构成的基线下方的区域。区别minOperation是您需要删除的区域单位数,以使所有元素与基线匹配(每次操作都会增加)。 -
一个可靠的算法可能是总是选择数组中第二小的元素,一个一个地增加与基线匹配的元素的数量。
-
"如果我们仔细研究每个操作以及问题陈述,我们会发现增加除最大元素之外的所有 n-1 个元素类似于仅减少最大元素。因此,最小元素不需要再减少,其余元素将减少到最小的一个。这样,使所有元素相等所需的操作总数将是......” - 这对我来说似乎很清楚。
-
将元素 B 减少到 A 需要 B-A 操作,将 2 个元素 B 和 C 减少到 A 需要 B-A + C-A = B+C-2*A 操作。概括一下,你就有了你的公式。