你和一群强盗准备打劫银行。给你一个下标从 0 开始的整数数组 security ,其中 security[i] 是第 i 天执勤警卫的数量。日子从 0 开始编号。同时给你一个整数 time 。
如果第 i 天满足以下所有条件,我们称它为一个适合打劫银行的日子:
第 i 天前和后都分别至少有 time 天。 第 i 天前连续 time 天警卫数目都是非递增的。 第 i 天后连续 time
天警卫数目都是非递减的。 更正式的,第 i 天是一个合适打劫银行的日子当且仅当:security[i - time] >=
security[i - time + 1] >= … >= security[i] <= … <= security[i +
time - 1] <= security[i + time].
请你返回一个数组,包含 所有 适合打劫银行的日子(下标从 0 开始)。返回的日子可以 任意 顺序排列。
class Solution {
public List<Integer> goodDaysToRobBank(int[] security, int time) {
/*
第 i 天前和后都分别至少有 time 天。
第 i 天前连续 time 天警卫数目都是非递增的。
第 i 天后连续 time 天警卫数目都是非递减的。
考虑使用两个数组,第一个数组arr1[i]记录i之前连续非递增的长度
arr2[i]记录i之后连续非递减的长度
对于任意的i,需要满足arr1[i]>=time并且arr2[i]>=time
*/
List<Integer> res = new ArrayList<>();
if(security.length<=time) return res;
int[] noIncr = new int[security.length];
int[] noDesc = new int[security.length];
noIncr[0] = 0;
noDesc[security.length-1]=0;
for(int i=1;i<security.length;i++){
if(security[i]<=security[i-1]){
noIncr[i]=noIncr[i-1]+1;
}else{
noIncr[i]=0;
}
}
for(int i=security.length-2;i>=0;i--){
if(security[i]<=security[i+1]){
noDesc[i]=noDesc[i+1]+1;
}else{
noDesc[i]=0;
}
}
for(int i=0;i<security.length;i++){
if(noIncr[i]>=time && noDesc[i]>=time){
res.add(i);
}
}
return res;
}
}