c# – 查找包含查询数组所有元素的输入数组的最小窗口

问题:给定大小为n的整数输入数组和大小为k的整数查询数组,找到包含查询数组的所有元素的输入数组的最小窗口,并且顺序也相同.

我试过下面的方法.

        int[] inputArray = new int[] { 2, 5, 2, 8, 0, 1, 4, 7 };
        int[] queryArray = new int[] { 2, 1, 7 };

将在inputArray中找到所有查询数组元素的位置.

public static void SmallestWindow(int[] inputArray, int[] queryArray)
    {
        Dictionary<int, HashSet<int>> dict = new Dictionary<int, HashSet<int>>();

        int index = 0;
        foreach (int i in queryArray)
        {
            HashSet<int> hash = new HashSet<int>();
            foreach (int j in inputArray)
            {
                index++;
                if (i == j)
                    hash.Add(index); 
            }
            dict.Add(i, hash);
            index = 0;
        }
      // Need to perform action in above dictionary.??
    }

我听了下面的字典

> int 2 – >位置{1,3}
> int 1 – >位置{6}
> int 7 – >位置{8}

现在我想执行以下步骤来找到最小窗口

>将int 2位置与int 1位置进行比较.如(6-3)< (6-1)..所以我将在hashmap中存储3,6.
>将比较上面的int 1和int 7的位置.

我无法理解我将如何比较字典的两个连续值.请帮忙.

最佳答案
算法:
对于查询数组中的每个元素,存储在映射M(V→(I,P))中,V是元素,I是输入数组的索引,P是查询数组中的位置. (某些P的输入数组索引最大,查询[0..P]是输入[I..curr]的子序列)

遍历数组.
如果该值是查询数组中的第一个术语:将当前索引存储为I.
否则:将前一个元素的索引值存储在查询数组中,例如: M [currVal] .I = M [查询[M [currVal] .P-1]].我.
如果该值是最后一项:检查[I..curr]是否是新的最佳值.

复杂
其复杂性为O(N),其中N是输入数组的大小.

注:
此代码期望查询数组中不重复任何元素.为了满足这个要求,我们可以使用地图M(V→listOf((I,P))).这是O(NhC(Q)),其中hC(Q)是查询数组的模式计数.
更好的是使用M(V→listOf((linkedList(I),P))).如果重复元素在查询数组中连续出现,我们使用链表.然后更新这些值将变为O(1).然后复杂度为O(NhC(D(Q))),其中D(Q)是Q,其中连续项被合并.

履行
示例java实现可用here.这不适用于查询数组中的重复元素,也不适用于错误检查等.

转载注明原文:c# – 查找包含查询数组所有元素的输入数组的最小窗口 - 代码日志