【问题标题】:How to solve this permutation related problem in O(n^2) complexity?如何在 O(n^2) 复杂度中解决这个与排列相关的问题?
【发布时间】:2021-11-24 08:43:59
【问题描述】:

有 2 个长度为 N 和 M 的数组 A 和 B,您必须一次从 B 中删除 1 个元素,并检查 A 中是否存在 B 的排列

说明: 示例:

N = 5
A = [1,2,2,1,1]
M = 3
b = [1,2,1]
Output: [0,2,3]

当您从 B 中删除第一个元素时,它变为 [2,1] 您可以在数组 A 中看到从索引 0 开始的长度为 2 的子数组是 [1,2] 并且 [1,2] 是 [ 2,1] 你有一个对应于这个子数组的匹配项。同样,从索引 2 开始的子数组也是匹配的。所以你现在有 2 个匹配对应索引 0 和 2。现在数组 B 被恢复 B = [1,2,1]

现在,当您从 B 中删除第二个元素时,它变为 [1,1],您可以找到与从索引 3 开始的子数组对应的 1 个匹配项

删除第 3 个元素没有用,因为我们之前已经删除了 1 并检查了它

因此答案是 [0,2,3]

【问题讨论】:

    标签: arrays algorithm data-structures permutation sub-array


    【解决方案1】:

    如果我们正在寻找 O(n^2) 复杂度,请对 A 中的每个窗口进行哈希处理,其中键是窗口中元素的排序列表,值是索引,在哪里可以看到它。对于您的示例,我们将:

    [1,2,2,1,1]
    
    1,1,1,2,2 -> [0]
    1,1,2,2   -> [0, 1]
    1,2,2     -> [0, 1]
    ...
    1,2       -> [0, 2]
    etc.
    

    如果预期会有很多重复项,我们也可以对一个键使用多重集,例如:

    1:3,2:2 -> [0]
    

    现在为B中删除的每个元素创建一个对应的key,我们遍历的时候,检查key是否在hash表中。

    B: {1: 2, 2: 1}
    
    Traverse:
    
    Key 1:1,2:1 -> indexes [0, 2]
    ...etc.
    

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2011-03-21
      相关资源
      最近更新 更多