如何分析k个空槽算法?

时间:2019-03-10 04:03:26

标签: algorithm data-structures array-algorithms

在Leet码上有一种称为K空槽的算法。我不明白这些限制。我试图研究对该问题的更好的解释,但找不到。如下:

  

有一个带有N个插槽的花园。在每个插槽中,都有一朵花。然后   花在N天内一朵朵开。每天都会有   恰好一朵鲜花盛开,它将处于盛开的状态   从那以后。

     

给出一个数组花,其中包含从1到N的数字。   该数组表示当天鲜花将要开放的地方。

     

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

     

也给定整数k,您需要输出存在的那一天   两朵花处于开花状态,还有几朵花   它们之间是k,这些花没有盛开。

     

如果没有这样的日子,则输出-1。

     

示例1:

     

输入:

     

花朵:[1、3、2]

     

k:1

     

输出:2

     

说明:第二天,第一朵和第三朵花   盛开。

     

示例2:

     

输入:

     

花朵:[1,2,3]

     

k:1

     

输出:-1

     

注意:

     

给定的数组将在[1,20000]范围内。

我想自己解决。我想知道是否对该问题有一个更简单的解释。我不了解k输入。我不明白为什么第一个示例返回2,但是第二个示例返回-1。

3 个答案:

答案 0 :(得分:1)

根据问题陈述:

1) 有一个带有N个插槽的花园。在每个插槽中,都有一朵花。 N朵花将在N天内一朵盛开。每天都会有一朵鲜花盛开,从那时起便处于盛开状态

从根本上讲,有一个大小为N的数组,这些数组是插槽,每天花朵盛开。这样数组的大小就会告诉您花朵的数量。

2) 给出一个数组,其中包含从1到N的数字。数组中的每个数字代表当天鲜花将要开放的位置。

arr [i]会告诉您花朵盛开的时间,而i(索引)会告诉您当天花朵盛开的日期。 例如:

[1,3,2]在这里告诉

  • 第一天:鲜花将在插槽1中盛开。
  • 第二天:花朵将在插槽3中盛开。
  • 第3天:花将在2号槽中盛开

3) 还给定一个整数k,您需要输出在哪一天有两朵花处于开花状态,并且它们之间的花数为k并且这些花没有开花

从此声明中,我们了解到,当两朵鲜花盛开在这些插槽中时,我们必须当天输出,这样它们之间的插槽应该为空并且它们之间的插槽数量等于k。如果没有这样的插槽,则返回-1。

第一个示例。 [1,3,2]如上所述,在第2天,花朵将在插槽3上开花,在第1天,花朵将在插槽1上开花,因此第2天空闲的插槽数为1(等于k)它们之间。因此,输出为第2天。

对于第二个示例,我们看到花朵位于连续的插槽中,因此它们之间不存在无花的花朵插槽,因此输出为-1。

希望这会有所帮助!

答案 1 :(得分:0)

您需要找到一个子数组,其中包含2朵开花花之间的k个不开花花。

public int kEmptySlots(int[] flowers, int k) {
        int[] days = new int[flowers.length];
        for (int i = 0; i < days.length; i++) {
            days[flowers[i] - 1] = i + 1;
        }
        int left = 0;
        int right = k + 1;
        int res = Integer.MAX_VALUE;
        for (int i = 1; right < days.length; i++) {
            // current days[i] is valid, continue scanning
            if (days[i] > days[left] && days[i] > days[right]) {
                continue;
            }
           // reach boundary of sliding window, since previous number are all valid, record result  
            if (i == right) {
                res = Math.min(res, Math.max(days[left],days[right]));
            }
            // not valid, move the sliding window
            left = i;
            right = left + k + 1;
        }
        return res == Integer.MAX_VALUE ? -1 : res;
    }

答案 2 :(得分:0)

最佳解决方案可以是:

class Solution {
public int kEmptySlots(int[] flowers, int k) {
    TreeSet<Integer> active = new TreeSet();
    int day = 0;
    for (int flower: flowers) {
        day++;
        active.add(flower);
        Integer lower = active.lower(flower)
        Integer higher = active.higher(flower);
        if (lower != null && flower - lower - 1 == k ||
                higher != null && higher - flower - 1 == k)
            return day;
    }
    return -1;
}

}