Skip to content

Latest commit

 

History

History
 
 

683.K-Empty-Slots

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

683.K-Empty-Slots

此题可以用set的迭代器来做,每插入一个元素,只要在这个有序容器里找到前面和后面一个元素,看看之间是否相差k即可.

更巧妙的o(n)解法是一个贪心策略.

我们将题目的条件转换成另一个数组days[i],表示位置的花在days[i]这一天开放.那么我们希望得到什么呢?我们希望有这么一个宽度为k+1的区间[left,right],对于任意left<i<right,都有days[i]>days[left] && days[i]>days[right].这说明这个区间内部的花都比两边的要晚开.等到left或right其中较晚的一个开放时,他们正好就是一对间隔K个pair.

那么如何找到这样一个窗口呢?我们尝试让它滑动起来.令left=0,right=left+k+1,然后逐个考察其中的是否符合条件.如果遇到不符合条件的,说明days[i]要比两边的都要早,成为了一个"钉子户",所有小于i的left都不可能符合要求了.那么显然,我们的策略就是让这个钉子户作为新的left,进行下一次的搜索.

注意,一旦找到一个合适的区间,那么输出的答案应该是max(days[left],days[right]),因为只有两边的花都开了,这个区间才成立.

Leetcode Link