如何有效地解决这个问题?
给定大小为n和整数k的数组,我们需要返回大小为k的窗口中所有不同数字的计数总和。窗户向前滑动。
e.g。 arr [] = {1,2,1,3,4,2,3};
设k = 4.
The first window is {1,2,1,3}, count of distinct numbers is 2….(1 is repeated)
The second window is {2,1,3,4} count of distinct numbers is 4
The third window is {1,3,4,2} count of distinct numbers is 4
The fourth window is {3,4,2,3} count of distinct numbers is 2
答案 0 :(得分:1)
你应该跟踪
如果可能的元素来自有限的集合,则带有频率的地图也可以是数组。
然后当你的窗户向右滑动时......
答案 1 :(得分:1)
您可以使用哈希表H
在迭代数组时跟踪窗口。您还为哈希表中的每个条目保留一个附加字段,用于跟踪该元素在窗口中出现的次数。
首先将k
的{{1}}元素添加到arr
。然后迭代H
的其余部分,减少刚离开窗口的元素的计数器字段,并增加进入窗口的元素的计数器字段。
在任何时候(包括初始插入arr
),如果计数器字段变为H
,则会增加窗口中不同元素的数量。当元素的最后一次出现离开窗口或第一次出现时,可能会发生这种情况。如果计数器字段变为除1
之外的任何其他值,则会减少窗口中不同元素的数量。
这是1
中元素数量的线性解决方案。散列整数可以像this那样完成,但是根据您用来实现解决方案的语言,您可能不需要自己散列它们。如果arr
的元素所在的范围足够小,则可以使用简单数组而不是哈希表,正如其他贡献者所建议的那样。
答案 2 :(得分:1)
实际上,我是问题的提问者,我没有回答这个问题,但我只是想对答案发表评论,但我不能因为我的名声很少。
我认为对于{1,2,1,3}和k = 4,给定的算法产生count = 3,但根据问题,计数应为2(因为1重复)