一【题目类别】
- 滑动窗口
二【题目难度】
- 简单
三【题目编号】
- 643.子数组最大平均数I
四【题目描述】
- 给你一个由 n n n 个元素组成的整数数组 n u m s nums nums 和一个整数 k k k 。
- 请你找出平均数最大且 长度为 k k k 的连续子数组,并输出该最大平均数。
- 任何误差小于 1 0 − 5 10^{-5} 10−5 的答案都将被视为正确答案。
五【题目示例】
-
示例 1:
- 输入:nums = [1,12,-5,-6,50,3], k = 4
- 输出:12.75
- 解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
-
示例 2:
- 输入:nums = [5], k = 1
- 输出:5.00000
六【题目提示】
- n = = n u m s . l e n g t h n == nums.length n==nums.length
- 1 < = k < = n < = 1 0 5 1 <= k <= n <= 10^{5} 1<=k<=n<=105
- − 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^{4} <= nums[i] <= 10^{4} −104<=nums[i]<=104
七【解题思路】
- 利用滑动窗口的思想
- 首先计算前k个元素值的和
- 然后进入循环遍历剩下的元素,每遍历到一个元素时,减去“窗口”中第一个元素,然后将新遍历到的元素加入“窗口”中,之后进行比较,取最大值
- 题目要求我们返回duoble类型,所以最后需要进行强制类型转换,用最大“窗口”的和除以窗口元素个数
- 最后返回结果即可
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为传入的数组的长度
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
class Solution {
public double findMaxAverage(int[] nums, int k) {
int tempMax = 0;
for(int i = 0;i<k;i++){
tempMax += nums[i];
}
int sum = tempMax;
for(int i = k;i<nums.length;i++){
sum = sum - nums[i - k] + nums[i];
tempMax = Math.max(tempMax,sum);
}
return (double)tempMax / k;
}
}
- C语言版
double findMaxAverage(int* nums, int numsSize, int k)
{
int tempSum = 0;
for(int i = 0;i<k;i++)
{
tempSum += nums[i];
}
int sum = tempSum;
for(int i = k;i<numsSize;i++)
{
sum = sum - nums[i - k] + nums[i];
tempSum = fmax(tempSum,sum);
}
return (double)tempSum / k;
}
- Python语言版
class Solution:
def findMaxAverage(self, nums: List[int], k: int) -> float:
tempSum = resSum = sum(nums[:k])
for i in range(k,len(nums)):
tempSum = tempSum - nums[i - k] + nums[i]
resSum = max(resSum,tempSum)
return resSum / k
- C++语言版
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int tempSum = 0;
for(int i = 0;i<k;i++)
{
tempSum += nums[i];
}
int sum = tempSum;
for(int i = k;i<nums.size();i++)
{
sum = sum - nums[i - k] + nums[i];
tempSum = max(tempSum,sum);
}
return (double)tempSum / k;
}
};
十【提交结果】
-
Java语言版
-
C语言版
-
Python语言版
-
C++语言版