Python算法最大化列表中的等元素数

时间:2014-12-16 20:10:24

标签: python arrays algorithm list

我正在尝试在Python中创建一个算法,该算法将从0到1,000,000的随机数列表中长度不超过100个元素,甚至可以尽可能地输出这个数组给出最大数量的相等元素。这就是我到目前为止所做的:

def answer(x):
    diff = max(x) - min(x)
    while diff > 1:
        x[x.index(max(x))] = x[x.index(max(x))] - (diff / 2)
        x[x.index(min(x))] = x[x.index(min(x))] + (diff / 2)
        diff = max(x) - min(x)
    return count(x)

def count(x):
    from collections import Counter
    c = Counter(x)
    return max(c.values())

这将采用诸如[0,50]之类的数组并创建数组[25,25]并返回整数2,因为数组中有两个相等的元素。我知道这个算法在大多数情况下都有效,但它并不是全部。 任何人都可以指出任何整数数组,这不会产生正确的答案吗?感谢

编辑:

对于那些不想阅读while循环的人来说,代码可以找到整个列表的范围。将范围分成两半并将最小值加一半,并从最大值减去一半。它试图在保持相同总和的同时平衡整个列表

[1,4,1] = [2,3,1] = [2,2,2] =(等元素数)3 [2,1,4,9] = [2,5,4,5] = [3,4,4,5] = [4,4,4,4] =(等元素数)全部{{1 }}

4 个答案:

答案 0 :(得分:4)

这个怎么样?

l = [1, 2, 5, 10]

# "best" possible case
l_m = [sum(l) / len(l)] * len(l)

# see if lists fit (division can cause rounding errors)

if sum(l_m) != sum(l):
    # if they don't this means we can only have len(l) - 1 similar items
    print len(l) - 1
else:
    # if sums fit the first list can be spread like this
    print len(l)

答案 1 :(得分:1)

我可以想象你试图让数组中尽可能多的元素保持相同,同时保持它们的总和,并保持元素整数

对于N元素,您可以使N - 1元素相等,并且运气好的话,所有N元素相等。

这对你来说有点伪代码:

average = sum(elements) / length(elements)  # a float
best_approximation = trunc(average)  # round() would also work
discrepancy = sum(elements) - best_approximation * length(elements)
discrepant_value = best_approximation + discrepancy
result = [discrepant_value] + the rest of list having best_approximation value

通过构造,您获得相等值length(elements) - 1discrepant_value一个{{1}}。

答案 2 :(得分:0)

在将输入规范化为整数平均值并在结果中分配余数时,您实际上在做什么。

L = [1,2,3,4,5,7]

# Calc the integer average
avg = sum(L)/len(L)

# Find the remainder
mod = sum(L)%len(L)

# Create a new list length of original
# populating it first with the average
L2 = [avg] * len(L)

# Then add 1 to each element for as many
# as the remainder
for n in range(mod): L2[n] += 1

def count(x):
    from collections import Counter
    c = Counter(x)
    return max(c.values())
count(L2)
4

您无需变形原始列表或创建新列表(无需使用import):

L = [1,2,3,4,5,7]

# Don't even need to figure the average if you
# find the remainder of the sum of your list
# divided by the length of your list
mod = sum(L)%len(L)

result = mod if mod >= len(L)/2 else len(L) - mod
print result
4

答案 3 :(得分:0)

这是我的最终解决方案。

在将整个数组的范围最小化到不大于1之后,它会检查数组中相等数字的数量是否与长度相同,这意味着数组看起来像这样:{{1}然后立即吐出相等数字(4)。如果列表中大多数相等数字的数量小于长度,则它使列表均衡。因此,如果列表类似[4,4,4,4],那么如果它可以转换为[4,4,3,3]则更为理想。这就是均衡功能可以做的事情。

[4,4,4,2]

http://repl.it/6bA/1