当前位置: 首页 > 知识库问答 >
问题:

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

彭琛
2023-03-14

我在一次面试中被问到这个问题。

您将获得一个由 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) Else 将数组中的每个不同元素存储在字典中。如果字典中不同元素的数量大于 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个答案

段兴为
2023-03-14

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

让我们假设我们得到了一个符合标准的排列。对于任何不同的元素,很容易观察到,如果它在i处的排列中找到,那么也必须找到它,在:i - k,i - 2k,... ,i mod ki k,i 2k,.., n - k(i mod k),因此在i处出现意味着在i % k处出现

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

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

 类似资料:
  • 我知道强力解O(n^2),我想要另一个解O(n),还是O(n,log,n)?

  • 问题内容: 给出了长度为 n 的数组。查找子数组元素的乘积之和。 说明 数组 A* = 长度 3的 [2,3,4] 。 * 长度为 2的 子数组= [2,3],[3,4],[2,4] [2,3] 中元素的乘积= 6 [3,4] 中元素的乘积= 12 [2,4] 中元素的乘积= 8 长度 2 = 6 + 12 + 8 = 26的子数组的总和 同样,对于长度 3 ,Sum = 24 因此,乘积以模 1

  • 我需要估计数组列表是否已排序(不排序)。 对字符串进行排序时,它们是按字母顺序排列的。我尝试使用compareTo()方法来确定哪个字符串先出现 如果数组列表已排序,则返回true,否则返回false。 代码: 简单测试: 这个简单的测试只显示覆盖率。 如何解决这个问题。

  • 我正在寻找性能最友好的方法来检查数组中的所有值是否为null,或者是否至少有一个元素具有其他类型。 也就是说,我需要一个方法,它根据传递的数组返回布尔值 例如:

  • 我正在寻找以下问题的答案。 给定一组整数(无重复项)和一个和,找出集合元素的所有可能组合,并求和。解的顺序并不重要(解{2,2,3}和{3,2,2}是相等的)。 请注意,最终组合不需要是集合,因为它可以包含重复。 示例:集合{2,3,5}和10 结果:{2, 2, 2, 2, 2},{2,2,3,3},{2,3,5},{5,5} 我已经研究过子集和问题以及硬币兑换问题,但不能使它们适应我的需要。我

  • 给定一个数组,计算具有给定总和的子数组的数量,使得索引按升序排列(它们不需要连续,但数组元素的索引应该按升序排列。) 例如,-Array-{1 2 3 4 5},Sum-5 Then{1,4}也是一个有效的子数组,因为索引是按升序(1 注意——这个问题看起来非常类似于子数组的计数问题,但是当索引以升序排列时就变得更加复杂了,因为那时会有更多的值。我请求有人请分享同样的伪代码,如果不可能,分享逻辑。