【问题标题】:Determine whether any permutation of a given array such that the sum of all subarrays of length K are equal确定给定数组的任何排列是否使得所有长度为 K 的子数组的总和相等
【发布时间】:2018-09-09 11:47:50
【问题描述】:

我在一次采访中被问到这个问题。

给你一个由 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  

我的方法是否正确?有没有更好的方法?

【问题讨论】:

  • 您的代码有效吗?它是否为您尝试过的示例提供了正确答案?
  • 是的,它适用于示例案例。
  • 由于您的代码有效,如果您正在寻找反馈,也许您应该将其发布到codereview.stackexchange.com
  • ` 如果 N == K,返回 True。` 真的吗?对于 K=6 的示例,它是如何工作的?
  • 在 N = K 的情况下,每个长度为 K 的子数组即 N 将包含 N 中的所有元素。在这种情况下,它们的总和也将相等,因为每个子数组都包含相同的元素。

标签: python arrays algorithm


【解决方案1】:

您的解决方案几乎是正确的。问题是,元素计数必须能被 n / k 整除。

证明

假设我们得到了一个满足条件的排列。对于任何不同的元素,很容易观察到,如果在i 的那个排列中找到它,它也必须在:i - k, i - 2k,... ,i mod ki + k, i + 2k,.., n - k + (i mod k) 找到,因此出现在i 意味着出现在@ 987654326@。现在,在索引低于k 的位置处的每个不同的出现都意味着n / k 的出现总数(这里n mod k = 0 是至关重要的事实)。

OP解决方案的反例

一个会破坏你解决方案的例子(几乎肯定是最小的):

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

【讨论】:

  • 谢谢@paler123。我明白我错在哪里了。
猜你喜欢
  • 2017-06-25
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2021-10-09
  • 2021-09-16
  • 1970-01-01
相关资源
最近更新 更多