一力扣中的简单题为例(因为我只会做简单题)
求子数组最大平均数
给你一个由 n
个元素组成的整数数组 nums
和一个整数 k
。
请你找出平均数最大且 长度为 k
的连续子数组,并输出该最大平均数。
任何误差小于 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 == nums.length
1 <= k <= n <= 105
-104 <= nums[i] <= 104
一,双循环
优点,简单不废脑子,缺点,数据很大时候会超时
double findMaxAverage(int* nums, int numsSize, int k) {
double average = 0;
double sum=0;
int max = INT_MIN;
for(int i=0;i<=numsSize-k;i++){
for(int j=i;j<i+k;j++){
sum+=nums[j];
}
max=fmax(sum,max);
sum=0;
}
average = max / (k * 1.0);
return average;
}
1.思路:
每四个加起来,比较大小,大的存入max中;
注意,max必须定义为一个特别特别特别小的数,不然数据较小的时候会产生错误,所以我将它定义为INT_MIN
二,滑动窗口
优点,省时间,缺点,我没学过
double findMaxAverage(int* nums, int numsSize, int k) {
double sum=0;
for(int i=0;i<k;i++){
sum+=nums[i];
}
double max=sum;
for(int i=k;i<numsSize;i++){
sum=sum-nums[i-k]+nums[i];
max=fmax(sum,max);
}
return (double)max/k;
}
1,思路
以求四个数的平
均数,为例子,先将前4个加起来,假设他是最大的数,然后向后移动,就像这样子
然后下四个数就是
这时候,这时候的sum,就是下一个数(5+1)和第一个数(5-4)的,只要循环上面的步骤,找出最大数,求平均数就行了。
注意,他求的和返回的都是doble型 。
求个赞和关注,谢谢!!!