给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
示例 1:
输入: [1,12,-5,-6,50,3], k = 4
输出: 12.75
解释: 最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
方法一:这个题我首先想到的方法是去找最大的连续k个数之和,然后再直接除以k就好了。那么这个题就转换成了寻找连续最大的k个数之和,至于怎么找这个最大和呢,我下面用的这个方法是硬找,所以时间复杂度较大,但还是把它给列出来了,方法二中的方法很简洁并且时间复杂度要小很多,推荐参考方法二。
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
double dMax = (double)INT_MIN;
int nCount = nums.size();
int nTemp = 0;
for(int i=0;i<nCount;i++)
{
int j=i;
int id = 0;
while(j<nCount && id < k)
{
nTemp += nums[j];
j++;
id++;
}
if(id == k)
{
dMax = nTemp > dMax ? nTemp : dMax;
nTemp = 0;
}
else
break;
}
return dMax/k;
}
};
方法二:先利用accumulate这个算法求出前k个数的和,然后再寻找下一个连续k个数的和,如果发现比原来的大就保留,更新dRes的值,最后的dRes的值就是连续最大的k个数的和,问题解矣。
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
double dHelper = accumulate(nums.begin(),nums.begin()+k,0);
double dRes = dHelper;
for(int i=k;i<nums.size();i++)
{
dHelper += nums[i] - nums[i-k];
dRes = max(dHelper,dRes);
}
return dRes/k;
}
};