官方用的动态规划,我用的滑动窗口。
就是维护一个长度为time+1的递减窗口,将符合要求的窗口尾部放入一个set。
然后倒序维护一个长度为time+1的递增窗口,如果符合要求的窗口头部在set中,将其放入答案中。
class Solution {
public List<Integer> goodDaysToRobBank(int[] security, int time) {
Set<Integer> left = new HashSet<>();
int st = 0;
int ed = 0;
while (st != security.length) {
int len = ed - st + 1;
if (len == time + 1) {
left.add(ed);
st++;
}
if (++ed == security.length) {
break;
}
if (security[ed] > security[ed - 1]) {
st = ed;
}
}
List<Integer> ans = new ArrayList<>();
st = security.length - 1;
ed = st;
while (st != -1) {
int len = ed - st + 1;
if (len == time + 1) {
if (left.contains(st)) {
ans.add(st);
}
ed--;
}
if (--st == -1) {
break;
}
if (security[st] > security[st + 1]) {
ed = st;
}
}
return ans;
}
}