给定一个大小为 n 的非空整数数组,找到使所有数组元素相等所需的最小移动次数,其中移动将 n - 1 个元素增加 1。
例子:
输入:[1,2,3]
输出:3
解释:只需要三个动作(记住每个动作增加两个元素):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4] 讨论
我试图强行使用它,但我无法提供正确的算法,循环不变量不正确。有人会用解释来解决它,以便我可以提高我的算法技能吗?
bool checkEquality(vector<int> &num)
{
for (int j = 1; j < num.size(); j++)
{
if (num[j] != num[j - 1])
{
return false;
}
}
return true;
}
int main() {
vector<int> num = { 1, 2,3 };
int numMoves = num.size() - 1;
int prev = 0;
int j = 0;
while(!checkEquality(num))
{
for (int i = prev; i < num.size(); i++)
{
for ( j = i; j < numMoves; j++)
{
num[j]++;
}
if (i == num.size())
{
prev = j;
j = 0;
}
else
prev = 0;
}
}
}
原文由 احمد 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以将问题视为减少元素而不是增加其他元素。
现在问题要简单得多。您只需要添加每个元素,直到它达到数组中的最大元素。我将解决如下: