给你一个长度为 n
的整数数组 nums
和一个正整数 k
。
一个数组的 能量值 定义为:
- 如果 所有 元素都是依次 连续 且 上升 的,那么能量值为 最大 的元素。
- 否则为 -1 。
你需要求出 nums
中所有长度为 k
的
子数组
的能量值。
请你返回一个长度为 n - k + 1
的整数数组 results
,其中 results[i]
是子数组 nums[i..(i + k - 1)]
的能量值。
解题思路:简单说就是每次都判断前三个数是否是有序的
-
初始化:
- 首先,我们检查输入参数
k
是否等于 1。如果k == 1
,那么我们不需要做任何连续性检查,直接返回nums
数组作为结果。
- 首先,我们检查输入参数
-
遍历
nums
数组:- 从
i = 1
开始遍历数组,比较当前元素nums[i]
与前一个元素nums[i-1]
的差值:- 如果
nums[i] - nums[i-1] == 1
,表示当前元素与前一个元素是连续的,计数器count
加一。 - 如果差值不为
1
,则表示连续的序列被打断,计数器count
重置为1
,表示新的子序列开始。
- 如果
- 从
-
判断计数是否满足要求:
- 如果
count
大于或等于k
,则表示从位置i-k+1
到i
之间的子序列的长度至少为k
,所以将nums[i]
添加到result
中。 - 如果当前子序列长度小于
k
,则按照要求在result
中添加-1
,表示该位置的子序列未达到长度要求。
- 如果
-
返回结果:
- 完成遍历后,返回构造好的结果数组
result
- 完成遍历后,返回构造好的结果数组
class Solution {
public:
vector<int> resultsArray(vector<int>& nums, int k) {
int n = nums.size();
if(k==1) return nums;
vector<int> result;
int count=1;
for(int i=1;i<n;i++){
if(nums[i]-nums[i-1]==1) count++;
else count=1;
if(count>=k) result.push_back(nums[i]);
else if(i-k+1>=0) result.push_back(-1);
}
return result;
}
};