643. 子数组最大平均数 I
切记,这里的三段式
右指针入队列-》判断-》左指针出队列以备下一次判断
因为这里只需要最后返回平均值,所以只需要最后进行强制类型转换为double即可,不需要提前把变量设置为double
cpp
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int ans = INT_MIN;
int temp = 0;
for(int right = 0; right < nums.size(); right++){
// 右指针
temp += nums[right];
//判断
int left = right - k + 1;
if(left < 0) continue;
ans = max(ans,temp);
//左指针出队列,以备下一次入队列
temp -= nums[left];
}
return (double)ans/k;
}
};
1343. 大小为 K 且平均值大于等于阈值的子数组数目
思路一点没变
cpp
class Solution {
public:
int numOfSubarrays(vector<int>& arr, int k, int threshold) {
int ans = 0;
int temp = 0;
for(int right = 0;right < arr.size();right++){
temp += arr[right];
int left = right - k + 1;
if(left < 0) continue;
if(temp >= threshold*k) ans++;
temp -= arr[left];
}
return ans;
}
};
2090. 半径为 k 的子数组平均值
思路很像,几乎没什么区别,这里注意示例元素和可能会超过int,要用long long;数组初始化使用-1会方便很多;
cpp
class Solution {
public:
vector<int> getAverages(vector<int>& nums, int k) {
vector<int>ans(nums.size(),-1);
long long temp = 0;
for(int right = 0;right < nums.size();right++){
temp += nums[right];
int left = right - 2*k ;
if(left < 0) continue;
//判断
ans[(left+right)/2] = temp/(2*k+1);
temp -= nums[left];
}
return ans;
}
};