Skip to content

Commit a010315

Browse files
authored
Create (数组操作、滑动窗口)643、子数组最大平均数1
1 parent d98767f commit a010315

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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

Comments
 (0)