数组中的相等元素

Mar*_*ria 2 java arrays algorithm mathematical-optimization

今天面试了,被问到一个问题,我都听不懂。

问题:

给定一个array 由整数组成的。

获取至少在相等的元素array

在计算时,您可以进行以下两种操作

  • 取数组的最小元素之一并将其值加一(更正式地说,如果 的最小值为 ,则选择这样的索引 = 并设置 :=+1);

  • 取数组的最大元素之一并将其值减一(更正式地说,如果 的最大值为 ,则选择这样的索引 = 并设置 :=?1)。

计算获得数组中至少相等元素所需的最小移动次数。

任何人都可以帮助我理解,实际问题是什么,以便我可以编写代码?

Seb*_*rek 5

直接回答您的问题,即“帮助我理解问题”:

例如,这是您的数组:

{1,2,5,7,8,3}
Run Code Online (Sandbox Code Playgroud)

现在,您只能执行这两个操作:

  1. 找到最小元素并增加它:
{2,2,5,7,8,3} // <-- increased 1
Run Code Online (Sandbox Code Playgroud)
  1. 减少最大元素:
{2,2,5,7,7,3} // <-- decreased 8
Run Code Online (Sandbox Code Playgroud)

现在的问题是:使这个数组包含k相同数字的最小移动次数是多少?


因此,如果k = 3数组与上述类似,那么其中一种解决方案是运行操作1三次:

  1. 在任何动作之前:
{1,2,5,7,8,3}
Run Code Online (Sandbox Code Playgroud)
  1. 第一次移动后:
{2,2,5,7,8,3} // <-- `1` changed to `2`
Run Code Online (Sandbox Code Playgroud)
  1. 第二次移动后:
{3,2,5,7,8,3} // <-- `2` changed to `3`
Run Code Online (Sandbox Code Playgroud)
  1. 第三步后:
{3,3,5,7,8,3} // <-- `2` changed to `3`
Run Code Online (Sandbox Code Playgroud)

所以结果数组将是:

{3,3,5,7,8,3}
Run Code Online (Sandbox Code Playgroud)

你现在明白问题了吗?

  • 同样,您将获得一个任意数组。并且您可以将当前最小的数字增加 1 或将当前最大的数字减少 1。他们给你一个“k”,例如“4”。现在您可以使用这两个运算来尝试获得 4 个相等的数字。例如“[1,2,5,7,8,3]”:增加,增加,增加,增加,增加,增加,增加,增加,增加。现在你有“[5, 5, 5, 7, 8, 5]”,因此是“5”的 4 倍。为此所需的操作次数为 9 次(增加了 9 倍)。是否有可能以更少的操作实现 4 倍相同的值? (2认同)