确定给定数组的任何排列是否使长度为K的所有子数组的总和相等

时间:2018-09-09 11:47:50

标签: python arrays algorithm

在一次采访中有人问我这个问题。

  

为您提供了一个由N个整数组成的数组。您需要确定是否存在给定数组的任何排列,以使长度为K的所有子数组的总和相等。 N可被K整除,即N mod K =0。
  如果数组为[1,2,1,3,2,3]且K = 2,则为False。
  如果数组为[1,2,1,3,2,3]且K = 3,则为True。

我的逻辑是这样。

  

1)如果N == K,则返回True。
  2)否则将每个不同的元素存储在字典中的数组中。如果字典中不同元素的数量大于K,则返回False。
  3)否则将每个不同元素的计数存储在字典中。
  4)如果任何不同元素的计数小于(N / K),则返回False。
  5)最后返回True。

这是我在Python中的代码:

def check(nums, n, k):
if n == k:
    return True
else:
    my_dict = {}
    for i in nums:
        if i not in my_dict:
            my_dict[i] = 1
        else:
            my_dict[i] += 1
    if len(my_dict) > k:
        return False
    count = int(n/k)
    for i,j in my_dict.items():
        if j < count:
            return False
    return True  

我采用正确的方法吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您的解决方案几乎是正确的。事实是,元素计数需要被n / k整除。

证明

让我们假设我们得到的排列满足条件。对于任何不同的元素,很容易观察到,如果在i的排列中找到了它,则也必须在i - k, i - 2k,... ,i mod ki + k, i + 2k,.., n - k + (i mod k)处找到它,因此在{{ 1}}表示在i处发生。现在,索引位置低于i % k < k的位置上的每个不同事件都表示总共k个事件(这里n / k是至关重要的事实)。

OP解决方案的计数器示例

一个可能会破坏您解决方案的示例(几乎肯定是最小的):

  

n = 8,k = 4   数组= [1、1、1、2、2、2、2、2]