@@ -84,21 +84,17 @@ tags:
84
84
85
85
<!-- solution:start -->
86
86
87
- ### 方法一:滑动窗口(写法一)
87
+ ### 方法一:滑动窗口
88
88
89
- 半径为 $k$ 的子数组个数为 $k \times 2 + 1$,因此,我们不妨将 $k \times 2 + 1$ 记为 $k $。
89
+ 半径为 $k$ 的子数组的长度为 $k \times 2 + 1$,因此我们可以维护一个大小为 $k \times 2 + 1$ 的窗口,记窗口中的所有元素和为 $s $。
90
90
91
- 我们创建一个长度为 $n$ 的答案数组 $ans$,初始时每项元素均为 $-1$。
91
+ 我们创建一个长度为 $n$ 的答案数组 $\textit{ ans}$,初始时每个元素都为 $-1$。
92
92
93
- 接下来,我们首先判断 $k$ 是否大于数组 ` nums ` 的长度 $n$,如果是,则直接返回答案数组。
94
-
95
- 否则,我们计算数组 ` nums ` 的前 $k$ 个元素的和 $s$,并将其除以 $k$ 得到的商赋值给答案数组 $ans$ 的第 $j$ 个元素,其中 $j = k / 2$。
96
-
97
- 然后,我们从 $k$ 开始遍历数组 ` nums ` ,每次遍历时,我们将 $nums[ i] $ 的值加到 $s$ 中,同时减去 $nums[ i - k] $ 的值,并且更新 $j = j + 1$,那么我们就得到了以第 $j$ 个元素为中心,半径为 $k$ 的子数组的和 $s$,将其除以 $k$ 得到的商赋值给答案数组 $ans$ 的第 $j$ 个元素。
93
+ 接下来,我们遍历数组 $\textit{nums}$,将 $\textit{nums}[ i] $ 的值加到窗口的和 $s$ 中,如果此时 $i \geq k \times 2$,说明此时窗口大小为 $k \times 2 + 1$,那么 $\textit{ans}[ i-k] = \frac{s}{k \times 2 + 1}$,然后我们将 $\textit{nums}[ i - k \times 2] $ 的值从窗口和 $s$ 中移出。继续遍历下个元素。
98
94
99
95
最后返回答案数组即可。
100
96
101
- 时间复杂度 $O(n)$,其中 $n$ 为数组 ` nums ` 的长度。忽略答案的空间消耗 ,空间复杂度 $O(1)$。
97
+ 时间复杂度 $O(n)$,其中 $n$ 为数组 $\textit{ nums}$ 的长度。忽略答案数组的空间消耗 ,空间复杂度 $O(1)$。
102
98
103
99
<!-- tabs:start -->
104
100
@@ -107,150 +103,11 @@ tags:
107
103
``` python
108
104
class Solution :
109
105
def getAverages (self , nums : List[int ], k : int ) -> List[int ]:
110
- k = k << 1 | 1
111
106
n = len (nums)
112
107
ans = [- 1 ] * n
113
- if k > n:
114
- return ans
115
- s = sum (nums[:k])
116
- j = k // 2
117
- ans[j] = s // k
118
- for i in range (k, n):
119
- j += 1
120
- s += nums[i] - nums[i - k]
121
- ans[j] = s // k
122
- return ans
123
- ```
124
-
125
- #### Java
126
-
127
- ``` java
128
- class Solution {
129
- public int [] getAverages (int [] nums , int k ) {
130
- k = k << 1 | 1 ;
131
- int n = nums. length;
132
- int [] ans = new int [n];
133
- Arrays . fill(ans, - 1 );
134
- if (k > n) {
135
- return ans;
136
- }
137
- long s = 0 ;
138
- for (int i = 0 ; i < k; ++ i) {
139
- s += nums[i];
140
- }
141
- int j = k / 2 ;
142
- ans[j] = (int ) (s / k);
143
- for (int i = k; i < n; ++ i) {
144
- s += nums[i] - nums[i - k];
145
- ans[++ j] = (int ) (s / k);
146
- }
147
- return ans;
148
- }
149
- }
150
- ```
151
-
152
- #### C++
153
-
154
- ``` cpp
155
- class Solution {
156
- public:
157
- vector<int > getAverages(vector<int >& nums, int k) {
158
- k = k << 1 | 1;
159
- int n = nums.size();
160
- vector<int > ans(n, -1);
161
- if (k > n) {
162
- return ans;
163
- }
164
- long long s = accumulate(nums.begin(), nums.begin() + k, 0LL);
165
- int j = k / 2;
166
- ans[ j] = s / k;
167
- for (int i = k; i < n; ++i) {
168
- s += nums[ i] - nums[ i - k] ;
169
- ans[ ++j] = s / k;
170
- }
171
- return ans;
172
- }
173
- };
174
- ```
175
-
176
- #### Go
177
-
178
- ```go
179
- func getAverages(nums []int, k int) []int {
180
- k = k<<1 | 1
181
- n := len(nums)
182
- ans := make([]int, n)
183
- for i := range ans {
184
- ans[i] = -1
185
- }
186
- if k > n {
187
- return ans
188
- }
189
- s := 0
190
- for _, x := range nums[:k] {
191
- s += x
192
- }
193
- j := k >> 1
194
- ans[j] = s / k
195
- for i := k; i < n; i++ {
196
- s += nums[i] - nums[i-k]
197
- j++
198
- ans[j] = s / k
199
- }
200
- return ans
201
- }
202
- ```
203
-
204
- #### TypeScript
205
-
206
- ``` ts
207
- function getAverages(nums : number [], k : number ): number [] {
208
- k = (k << 1 ) | 1 ;
209
- const n = nums .length ;
210
- const ans: number [] = Array (n ).fill (- 1 );
211
- if (k > n ) {
212
- return ans ;
213
- }
214
- let s = nums .slice (0 , k ).reduce ((acc , cur ) => acc + cur , 0 );
215
- let j = k >> 1 ;
216
- ans [j ] = Math .floor (s / k );
217
- for (let i = k ; i < n ; ++ i ) {
218
- s += nums [i ] - nums [i - k ];
219
- ans [++ j ] = Math .floor (s / k );
220
- }
221
- return ans ;
222
- }
223
- ```
224
-
225
- <!-- tabs: end -->
226
-
227
- <!-- solution: end -->
228
-
229
- <!-- solution: start -->
230
-
231
- ### 方法二:滑动窗口的另一种写法
232
-
233
- 我们维护一个大小为 $k \times 2 + 1$ 的窗口,记窗口中的所有元素和为 $s$。
234
-
235
- 与方法一一样,我们创建一个长度为 $n$ 的答案数组 $ans$,初始时每项元素均为 $-1$。
236
-
237
- 接下来遍历数组 ` nums ` ,将 $nums[ i] $ 的值加到窗口的和 $s$ 中,如果此时 $i \geq k \times 2$,说明此时窗口大小为 $k \times 2 + 1$,那么 $ans[ i-k] = \frac{s}{k \times 2 + 1}$,然后我们将 $nums[ i - k \times 2] $ 的值从窗口和 $s$ 中移出。继续遍历下个元素。
238
-
239
- 最后返回答案数组即可。
240
-
241
- 时间复杂度 $O(n)$,其中 $n$ 为数组 ` nums ` 的长度。忽略答案的空间消耗,空间复杂度 $O(1)$。
242
-
243
- <!-- tabs: start -->
244
-
245
- #### Python3
246
-
247
- ``` python
248
- class Solution :
249
- def getAverages (self , nums : List[int ], k : int ) -> List[int ]:
250
108
s = 0
251
- ans = [- 1 ] * len (nums)
252
- for i, v in enumerate (nums):
253
- s += v
109
+ for i, x in enumerate (nums):
110
+ s += x
254
111
if i >= k * 2 :
255
112
ans[i - k] = s // (k * 2 + 1 )
256
113
s -= nums[i - k * 2 ]
@@ -286,7 +143,7 @@ public:
286
143
vector<int > getAverages(vector<int >& nums, int k) {
287
144
int n = nums.size();
288
145
vector<int > ans(n, -1);
289
- long s = 0;
146
+ long long s = 0;
290
147
for (int i = 0; i < n; ++i) {
291
148
s += nums[ i] ;
292
149
if (i >= k * 2) {
@@ -304,10 +161,12 @@ public:
304
161
```go
305
162
func getAverages(nums []int, k int) []int {
306
163
ans := make([]int, len(nums))
307
- s := 0
308
- for i, v := range nums {
164
+ for i := range ans {
309
165
ans[i] = -1
310
- s += v
166
+ }
167
+ s := 0
168
+ for i, x := range nums {
169
+ s += x
311
170
if i >= k*2 {
312
171
ans[i-k] = s / (k*2 + 1)
313
172
s -= nums[i-k*2]
@@ -322,7 +181,7 @@ func getAverages(nums []int, k int) []int {
322
181
``` ts
323
182
function getAverages(nums : number [], k : number ): number [] {
324
183
const n = nums .length ;
325
- const ans: number [] = new Array (n ).fill (- 1 );
184
+ const ans: number [] = Array (n ).fill (- 1 );
326
185
let s = 0 ;
327
186
for (let i = 0 ; i < n ; ++ i ) {
328
187
s += nums [i ];
0 commit comments