在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。
答案 0 :(得分:1)
根据问题陈述:
1) 有一个带有N个插槽的花园。在每个插槽中,都有一朵花。 N朵花将在N天内一朵盛开。每天都会有一朵鲜花盛开,从那时起便处于盛开状态
从根本上讲,有一个大小为N的数组,这些数组是插槽,每天花朵盛开。这样数组的大小就会告诉您花朵的数量。
2) 给出一个数组,其中包含从1到N的数字。数组中的每个数字代表当天鲜花将要开放的位置。 >
arr [i]会告诉您花朵盛开的时间,而i(索引)会告诉您当天花朵盛开的日期。 例如:
[1,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;
}
}