8000 added 643 · xiaokai1996/LeetCode-1@ceb5757 · GitHub
[go: up one dir, main page]

Skip to content

Commit ceb5757

Browse files
committed
added 643
1 parent feaec0b commit ceb5757

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
这道题虽然是求平均数,但可以视为求和。且已经规定了连续数组,那么就完全可以想像成一个长度为 k 的滑块。从头滑到尾,统计一下最大那个和就好了。
2+
3+
所以最常规的思路就是先求出滑块的初始和:
4+
5+
```cpp
6+
double sum = 0.0;
7+
for (int i = 0; i != k; ++i) {
8+
sum += nums[i];
9+
}
10+
```
11+
12+
然后滑块开始滑动,滑动的过程可以理解为,去头接尾:
13+
14+
```cpp
15+
for (int i = 1; i + k <= nums.size(); ++i) {
16+
sum += nums[i+k-1] - nums[i-1];
17+
}
18+
```
19+
20+
然后另设一个变量,如 max_sum 来统计最大的 sum 即可。
21+
22+
----
23+
24+
稍微 trick 一点的改进呢,就是把滑块想像成一个蠕虫。蠕虫拱起来的最高点就是它前进的标志。那么在这个问题里,我们最关心的就是求和这个过程,所以可以把这个最高点视为求和。
25+
26+
那么蠕虫向前移动的步骤,就是不断累加和的过程,但吞一口,必须得拉一次,这个别忘了。
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include "solution.h"
2+
#define CATCH_CONFIG_MAIN
3+
#include "../Catch/single_include/catch.hpp"
4+
5+
TEST_CASE("Test findMaxAverage", "[vector]") {
6+
Solution s;
7+
SECTION("example case") {
8+
std::vector<int> arr{1, 12, -5, -6, 50, 3};
9+
int k = 4;
10+
double ans = s.findMaxAverage(arr, k);
11+
REQUIRE(ans == 12.75);
12+
}
13+
SECTION("include zero") {
14+
std::vector<int> arr{0, 4, 0, 3, 2};
15+
int k = 1;
16+
double ans = s.findMaxAverage(arr, k);
17+
REQUIRE(ans == 4.0);
18+
}
19+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include <algorithm>
2+
#include <vector>
3+
using std::vector;
4+
5+
class Solution {
6+
public:
7+
double findMaxAverage(vector<int>& nums, int k) {
8+
for (int i = 1; i < k; ++i) {
9+
nums[i] += nums[i - 1];
10+
}
11+
double sum = nums[k - 1];
12+
for (int i = k; i < nums.size(); ++i) {
13+
nums[i] += nums[i - 1];
14+
sum = std::max<double>(sum, nums[i] - nums[i - k]);
15+
}
16+
return sum / k;
17+
}
18+
};

0 commit comments

Comments
 (0)
0