查找每个k子阵列中不同元素的计数

时间:2015-08-08 11:23:21

标签: arrays algorithm integer distinct-values

如何有效地解决这个问题?

给定大小为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

3 个答案:

答案 0 :(得分:1)

你应该跟踪

  • 计算窗口中元素频率的地图
  • 当前的总和。

如果可能的元素来自有限的集合,则带有频率的地图也可以是数组。

然后当你的窗户向右滑动时......

  1. 将新号码的频率提高1。
  2. 如果该频率现在为1,请将其添加到当前总和。
  3. 将旧号码的频率减少1。
  4. 如果该频率现在为0,则从当前总和中减去它。

答案 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重复)