n次转换后数组中相等元素的最大数量

时间:2013-10-21 16:28:54

标签: arrays algorithm

你有一个包含n个元素的数组。在任何移动中,您选择两个索引i和j,i不等于j并且在一个索引处增加值并且在其他索引处减小值。您可以多次进行此移动。我们需要的是可以具有相同值的最大元素数量(在任意数量的移动之后)。 1,2,3,4答案的示例是3,因为在应用移动任意次之后我们最多可以有3个元素相等。但我正在寻找算法来做到这一点,所以需要帮助。

3 个答案:

答案 0 :(得分:3)

如上所述,这并不需要太多的算法。如果您可以根据需要多次执行此操作,则始终能够获得NN-1元素相等的结果(其中N是输入数组的大小。)

获取输入的总和。例如,在您的情况下:sum(1,2,3,4) = 10

如果sum % N == 0,答案为N。在此之前的任何时候,您将至少有一个元素高于sum/N并且至少有一个元素低于N-1。增加低点,递减高点。

否则答案是N-1。最后一组可以有(int)sum/N个元素等于{{1}},最后一个元素将是原始总和的余数。您可以将最后一个元素用作“备用”来增加/减少您想要的任何其他元素。

由于您不必实际找到转换,因此最终结果为O(N)。你只需取总和并用N来修改它来检查给出的答案。除非你想找到导致答案的步骤序列,否则没有使用递归或搜索“平均对”的方法。

答案 1 :(得分:0)

这可能是一个非常无效的算法 - 但你可以尝试某种动态编程。

def elems(array, previous_attempts = []):
    # Get a list of all the possible arrays (after transforming the current array)
    # and remove all of the arrays we have seen so far.
    possible_arrays = possibilities(array) - previous_attempts

    # If there are no more possible, return the number of elements the array
    # has in common.
    if possible_arrays is empty:
        return num_in_common(array)

    # Otherwise, for all the possibilities find the one that creates the maximum
    # amount of elements in common.
    max = 0
    for a in possible_arrays:
        # This is a recursive call that calculates the score for the possibility.
        # It also keeps track of the current state so we don't revisit it.
        score = elems(a, previous_attempts.append(array))
        if score > max:
            max = score
    return max

答案 2 :(得分:0)

您可以计算数组中每个值的出现次数(让我们调用大小为A的数组N)。假设A中任何值的最大出现次数为max(可能是多个值),您只对出现max次的值感兴趣,因为其他值不能建议的方法超过max+1次出现。

极端情况:

  1. 如果max=N答案为N
  2. 如果max=N-1答案为N-1
  3. 在所有其他情况下,对于出现V次的每个值max,您试图找到平均值为V但不等于{{}的其他两个值{1}}。如果它们存在,那么答案是V(你可以增加它们,使它们都等于max+2)。如果不存在此类索引Vi,则答案为j(您可以增加任何其他两个值,直到其中一个值等于max+1)。

    修改 这个答案假定您只选择Vi一次,然后根据需要增加/减少它们(我想我误解了)。