题目
思路
遍历数组,存储每个元素左边递增和右边递减的长度,如果递增和递减的长度都大于等于time,就添加进结果数组中。
代码
class Solution {
public:
vector<int> goodDaysToRobBank(vector<int>& security, int time) {
int n = security.size();
vector<int> inc(n), dec(n);
for(int i = 1; i < n; i++){
inc[i] = security[i] <= security[i - 1] ? inc[i - 1] + 1 : 0;
dec[n - 1 - i] = security[n - 1 - i] <= security[n - i] ? dec[n - i] + 1 : 0;
}
vector<int> ans;
for(int i = time; i < n - time; i++){
if(inc[i] >= time && dec[i] >= time){
ans.push_back(i);
}
}
return ans;
}
};
思路 不使用额外空间
使用两个变量标志左右非递增和非递减的个数。
代码
class Solution {
public:
vector<int> goodDaysToRobBank(vector<int>& security, int time) {
int n = security.size();
vector<int> ans;
if(time == 0){
for(int i = 0; i < n; i++)
ans.push_back(i);
return ans;
}
int left = 0, right = 0;
for(int i = 1; i < n - time; i++){
security[i - 1] >= security[i] ? left++ : left = 0;
security[i + time - 1] <= security[i + time] ? right++ : right = 0;
if(left >= time && right >= time)
ans.push_back(i);
}
return ans;
}
};