【问题标题】:Minimum Moves to Equal Array Elements help to understand the solution最小移动到相等的数组元素有助于理解解决方案
【发布时间】:2020-10-06 20:17:18
【问题描述】:

我看到了一个解决方案,但我无法理解该解决方案背后的原因,我想了解为什么该解决方案是正确的(这个想法背后的原因是什么), 问题是“最小移动到相等的数组元素”。 我看到的解决方案是:

 int minMoves(vector<int>& nums) {
    long minimum = nums[0]; 
    long sum = nums[0];
    for (int i = 1; i < nums.size(); ++i) {
        sum += nums[i];
        if (nums[i] < minimum)
            minimum = nums[i];
    }
    return sum - minimum * nums.size();
}

我不明白为什么元素的总和减去最小元素乘以数组的长度可以解决问题?

编辑:这是对问题的解释: 给定一个大小为 n 的非空整数数组,找到使所有数组元素相等所需的最小移动次数,其中移动将 n - 1 个元素增加 1。 示例:

输入: [1,2,3]

输出: 3

说明: 只需要三个动作(记住每个动作增加两个元素):

[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]

【问题讨论】:

  • 您应该首先详细说明问题所在,并举例说明。事实上,我无法理解问题所在。
  • 我认为问题是这样的:你有一个整数数组,你唯一的动作是减少一个元素,拥有一个所有元素相等的数组的最小移动次数是多少。
  • 问题正是“larticho”写的。
  • 你确定这是正确的吗?你试过一些例子吗?这些实验的结果是什么?通过执行这些实验,你学到了什么? ...?
  • @RoniBelkin,编辑问题并在上面写下问题的定义。

标签: c++ algorithm


【解决方案1】:

根据我对@larticho 在 cmets 中解释的问题的理解,给出的唯一运算符是减号。因此,你不能做的是你不能改变 minimum 的值(或者如果你改变它,它是没有意义的,它只会导致额外的移动)。因此,您要做的就是将每个其他元素的大小最小化为相等。因此,移动的总数等于所有元素的距离,从最小值开始。

即∑i=1..n (xi - min),如果你把它放在两个单独的和中,它将是 ∑i=1..n xi - ∑i=1..n min,即写成 ∑ xi - n * min在代码中。

【讨论】:

    【解决方案2】:

    据我了解,你的问题是:你有一个整数数组,你唯一的动作是减少一个元素,你必须做的最小移动次数是多少才能让一个所有元素都相等的数组。

    这个问题的第一个想法是首先寻找数组的最小值,然后添加每个元素与最小值之间的差异。

    所以在这里,min 是数组的最小值,您想要计算 nums[i]-min 的总和,因为 i 介于 0 和数组的大小之间。但这与计算nums[i]的总和(你的数组元素的总和),然后是min的总和,然后做差值是一样的。

    min 保持不变,您的min 总和与min*nums.size() 相同。

    在您给出的答案中,数组的最小值和总和都是在同一个for 循环中计算的。之后,它会给你我之前解释的差异,这就是你的答案。

    【讨论】:

    • 我有数组,我可以增加每次迭代中的所有元素,除了每次迭代中的一个成员。我可以更改每次迭代中不会增加的数字的选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2022-01-15
    • 2023-02-07
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多