在一次采访中有人问我这个问题。
为您提供了一个由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
我采用正确的方法吗?有更好的方法吗?
答案 0 :(得分:2)
您的解决方案几乎是正确的。事实是,元素计数需要被n / k
整除。
让我们假设我们得到的排列满足条件。对于任何不同的元素,很容易观察到,如果在i
的排列中找到了它,则也必须在i - k, i - 2k,... ,i mod k
和i + k, i + 2k,.., n - k + (i mod k)
处找到它,因此在{{ 1}}表示在i
处发生。现在,索引位置低于i % k < k
的位置上的每个不同事件都表示总共k
个事件(这里n / k
是至关重要的事实)。
一个可能会破坏您解决方案的示例(几乎肯定是最小的):
n = 8,k = 4 数组= [1、1、1、2、2、2、2、2]