给你一个大小为 n 下标从 0 开始的整数数组 nums 和一个正整数 k 。
对于 k <= i < n - k 之间的一个下标 i ,如果它满足以下条件,我们就称它为一个 好 下标:
下标 i 之前 的 k 个元素是 非递增的 。
下标 i 之后 的 k 个元素是 非递减的 。
按 升序 返回所有好下标。
示例 1:
输入:nums = [2,1,1,1,3,4,1], k = 2
输出:[2,3]
解释:数组中有两个好下标:
- 下标 2 。子数组 [2,1] 是非递增的,子数组 [1,3] 是非递减的。
- 下标 3 。子数组 [1,1] 是非递增的,子数组 [3,4] 是非递减的。
注意,下标 4 不是好下标,因为 [4,1] 不是非递减的。
示例 2:
输入:nums = [2,1,1,2], k = 2
输出:[]
解释:数组中没有好下标。
提示:
n == nums.length
3 <= n <= 105
1 <= nums[i] <= 106
1 <= k <= n / 2
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-all-good-indices
思路:
分成两部分来看,前一部分非递增,后一部分非递减,再将他们拼起来看。
初始化f(i)为以i为结尾的非递增序列的长度,g(i)为以i为开头的非递减的序列的长度。
AC代码:
class Solution {
public:
vector<int> goodIndices(vector<int>& nums, int k) {
int n = nums.size();
vector<int> f(n),g(n);
for(int i=0;i<n;i++){
f[i]=1;
if(i && nums[i-1]>=nums[i])
f[i]=f[i-1]+1;
}
for(int i=n-1;i>=0;i--){
g[i]=1;
if(i<n-1 && nums[i+1]>=nums[i])
g[i]=g[i+1]+1;
}
vector<int> res;
for(int i=k;i<n-k;i++){
if(f[i-1]>=k&&g[i+1]>=k)
res.push_back(i);
}
return res;
}
};