关于滑动窗口的算法

时间:2018-02-04 09:29:20

标签: algorithm data-structures treeset sliding-window

此问题是来自leetcode的k empty slot的变体。 新的问题是,要求找到有k个连续盛开的鲜花的最后一天。

e.g。 总共7天,1代表花开,0代表花不开花,k = 3

day1:1 0 0 0 0 0 0

day2:1 0 1 0 0 0 0

day3:1 1 1 0 0 0 0 1st time find k consecutive bloomed flowers

更新:     lastDayBloomKflowers = 3

day4:1 1 1 0 1 0 0

day5:1 1 1 0 1 1 0

day6:1 1 1 0 1 1 1 2nd time find k consecutive boomed flowers

更新:     lastDayBloomKflowers = 6

day7:1 1 1 1 1 1 1

最后,鲜花将在所有位置绽放

所以最终的解决方案是lastDayBloomKflowers = 6

我们如何获得lastDayBloomKflowers? 时间复杂度为O(nlogn),空格为O(n)

我知道如何解决原始的leetcode问题,我想使用树集,但对于这个变种,我不知道我应该使用什么数据结构,并有效地解决它。

感谢您的时间!

/////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////

我正在寻求k空槽问题变体的帮助。

由于leetcode上的k空插槽问题的url是素数,而你们中的一些人可能无法打开,我会在这里向你展示原始k空插槽问题:

有一个带N个插槽的花园。在每个插槽中,都有一朵花。 N花将在N天内逐一绽放。在每一天,都会有一朵鲜花盛开,从此开始盛开。

给定一个数组花由1到N之间的数字组成。数组中的每个数字代表花在那一天打开的地方。

例如,flowers [i] = x表示在第i天开花的独特花将位于x位置,其中i和x将在1到N的范围内。

同样给出一个整数k,你需要输出哪一天在盛开的状态下有两朵花,而且它们之间的花数是k,这些花没有晕染。

1 个答案:

答案 0 :(得分:0)

让我们将日线转换为表示每天更新位置的数组:

day1:1 0 0 0 0 0 0
array: [None,1] means on day 1, flower 1 bloomed

day2:1 0 1 0 0 0 0
array: [None,1,3] means on day 2, flower 3 bloomed

day3:1 1 1 0 0 0 0
array: [None,1,3,2] means on day 3 flower 2 bloomed

day4:1 1 1 0 1 0 0
array: [None,1,3,2,5]

day5:1 1 1 0 1 1 0
array: [None,1,3,2,5,6]

day6:1 1 1 0 1 1 1 
array: [None,1,3,2,5,6,7]

day7:1 1 1 1 1 1 1
array: [None,1,3,2,5,6,7,4]

现在让我们用一个滑动窗口迭代这个数组:

[None,1,3,2,5,6,7,4]
k: 1 |-|  min,max 1
k: 2 |---|  min,max 1,3
k: 3 |-----| min,max 1,3 and count is 3 so days must be consecutive,
             record (1,3) and day 3
k: 3   |-----| min,max 2,5 not consecutive
k: 3     |-----| min,max 2,6 not consecutive
k: 3       |-----| min,max 5,7 and count is 3 so days must be consecutive
                   also 6 is greater than 3 and (5,7) does not
                   overlap with (1,3) so the last day is now
                   known to be 6
k: 3         |-----| min,max 4,7 not consecutive