|
| 1 | +/* |
| 2 | +给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。 |
| 3 | + |
| 4 | +示例 1: |
| 5 | + |
| 6 | +输入: [1,12,-5,-6,50,3], k = 4 |
| 7 | +输出: 12.75 |
| 8 | +解释: 最大平均数 (12-5-6+50)/4 = 51/4 = 12.75 |
| 9 | + |
| 10 | + |
| 11 | + |
| 12 | +注意: |
| 13 | + |
| 14 | + 1 <= k <= n <= 30,000。 |
| 15 | + 所给数据范围 [-10,000,10,000]。 |
| 16 | +*/ |
| 17 | + |
| 18 | +double findMaxAverage(int* nums, int numsSize, int k) |
| 19 | +{ |
| 20 | + double average = 0; |
| 21 | + double max_average = -10000; |
| 22 | + |
| 23 | + for(int i = 0; i <= numsSize - k; i++) |
| 24 | + { |
| 25 | + int offset = 0; |
| 26 | + int sum = 0; |
| 27 | + |
| 28 | + while(offset < k) |
| 29 | + { |
| 30 | + sum = sum + nums[i+offset]; |
| 31 | + offset++; |
| 32 | + } |
| 33 | + average = (double)sum / k; |
| 34 | + if(average > max_average) |
| 35 | + max_average = average; |
| 36 | + } |
| 37 | + |
| 38 | + return max_average; |
| 39 | +} |
| 40 | + |
| 41 | +/* |
| 42 | +采用滑动窗口的思路,计算区间内的平均值。 |
| 43 | +这种方法是滑窗每前进一步,都要重新计算窗口内数据的平均值, |
| 44 | +这样会产生大量的重复计算,影响效率,在测试时会超时。 |
| 45 | +*/ |
| 46 | + |
| 47 | +#define MAX(a,b) a > b ? a : b |
| 48 | +double findMaxAverage(int* nums, int numsSize, int k) |
| 49 | +{ |
| 50 | + double average = 0; |
| 51 | + double max_average = -10000; |
| 52 | + int tmp_sum = 0; |
| 53 | + |
| 54 | + for(int i = 0; i < k; i++) |
| 55 | + tmp_sum = tmp_sum + nums[i]; |
| 56 | + average = (double)tmp_sum / k; |
| 57 | + max_average = MAX(average, max_average); |
| 58 | + |
| 59 | + for(int i = 1; i <= numsSize - k; i++) |
| 60 | + { |
| 61 | + tmp_sum = tmp_sum - nums[i-1] + nums[i+k-1]; |
| 62 | + average = (double)tmp_sum / k; |
| 63 | + max_average = MAX(max_average, average); |
| 64 | + } |
| 65 | + |
| 66 | + return max_average; |
| 67 | +} |
| 68 | + |
| 69 | +/* |
| 70 | +这种方法依然是滑窗的思想,但是避免了重复计算。 |
| 71 | +当前滑窗内的数据总和tmp_sum是上一次滑窗内的总和-当前滑窗起始元素的 |
| 72 | +左侧数据nums[i-1]+当前滑窗内的最后一个元素nums[i+k-1], |
| 73 | +这样提高了计算效率,避免了重复计算。 |
| 74 | +*/ |
0 commit comments