给定一个序列,选出一个长度不小于x的区间使得他们的平均值最大。给出C++代码
时间: 2024-10-02 19:01:57 浏览: 21
这是一个经典的滑动窗口优化问题,可以用C++解决。我们可以使用两个指针,一个左边界l,一个右边界r,然后计算当前区间的平均值,每次移动右边界并更新结果。以下是C++代码示例:
```cpp
#include <iostream>
#include <vector>
double maxAverage(int* nums, int size, int x) {
if (size < x) return -1; // 如果数组长度小于x,不可能找到满足条件的区间
double sum = 0;
int windowSum = 0;
int left = 0;
for (int right = 0; right <= size - x; right++) {
// 将当前区间的元素加到sum中,移除左边界的元素
sum += nums[right] - nums[left];
// 计算新的窗口平均值
windowSum += nums[right];
// 更新最大平均值
while (windowSum >= x * nums[left]) {
sum -= nums[left]; // 移除左边界的元素
left++; // 左边界向右移动
}
double avg = (double)windowSum / x;
if (avg > result) {
result = avg;
}
}
return result;
}
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
int x = 3;
double result = maxAverage(nums.data(), nums.size(), x);
if (result == -1) {
std::cout << "No valid interval found with length at least " << x << std::endl;
} else {
std::cout << "The maximum average of a subarray of length " << x << " is: " << result << std::endl;
}
return 0;
}
阅读全文