[LeetCode]643. Maximum Average Subarray I 解题报告(C++)
题目描述
Given an array consisting of n
integers, find the contiguous subarray of given length k
that has the maximum average value. And you need to output the maximum average value.
Example 1:
Input: [1,12,-5,-6,50,3], k = 4
Output: 12.75
Explanation: Maximum average is (12-5-6+50)/4 = 51/4 = 12.75
Note:
- 1 <=
k
<=n
<= 30,000. - Elements of the given array will be in the range [-10,000, 10,000].
题目大意
- 给定数组.
- 找到长度为k的子串.
- 要求子串的均值最大.返回均值
解题思路
方法1:
- p[i] 表示 nums[0] + nums[1] + nums[i];
- 则计算长度为k的子串和就是 p[i]-p[i-k];
- 遍历i从k->n-1.得到最大的和.
- 再除以K即可.注意返回的是 double.
代码实现:
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int n = nums.size();
if (n < k) {
return 0.0;
}
vector<int> p(n, 0);
p[0] = nums[0];
// p[i]表示 num[0]+... num[i];
for (int i = 1; i < n; i++) {
p[i] =p[i-1]+ nums[i];
}
int res = p[k - 1];
for (int i = k; i < n; i++) {
int tmp = p[i] - p[i - k];
res = max(res, tmp);
}
return res / (k*1.0);
}
};
方法2:
- 维护一个滑动窗口.大小为k.
- 将窗口向右移动一位,即加上一个右边的数字,减去一个左边的数字
- 更新res
代码实现:
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int n = nums.size();
if (n < k) {
return 0.0;
}
int sum = 0;
for (int i = 0; i < k; ++i) {
sum += nums[i];
}
int res = sum;
for (int i = k; i < n; i++) {
sum = sum + nums[i] - nums[i - k];
res = max(res, sum);
}
return res / (k*1.0);
}
};