69
69
70
70
<!-- 这里可写通用的实现逻辑 -->
71
71
72
- 前缀和。
72
+ ** 方法一:前缀和**
73
+
74
+ 我们可以先预处理得到数组 ` nums ` 的前缀和数组 $s$,其中 $s[ i] $ 表示 $nums[ i] $ 的前 $i$ 个元素之和。
75
+
76
+ 接下来,创建一个长度为 $n$ 的答案数组 $ans$,初始时每项元素均为 $-1$。
77
+
78
+ 然后我们枚举在 $[ 0,..n-1] $ 范围内枚举所有 $i$,若 $i$ 满足 $i - k \geq 0$ 并且 $i + k \lt n$,我们将 $ans[ i] $ 更新为 $\frac{s[ i + k + 1] - s[ i - k] }{k \times 2 + 1}$。
79
+
80
+ 最后返回答案数组即可。
81
+
82
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 ` nums ` 的长度。
83
+
84
+ ** 方法二:滑动窗口**
85
+
86
+ 我们维护一个大小为 $k \times 2 + 1$ 的窗口,记窗口中的所有元素和为 $s$。
87
+
88
+ 与方法一一样,我们创建一个长度为 $n$ 的答案数组 $ans$,初始时每项元素均为 $-1$。
89
+
90
+ 接下来遍历数组 ` 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$ 中移出。继续遍历下个元素。
91
+
92
+ 最后返回答案数组即可。
93
+
94
+ 时间复杂度 $O(n)$,忽略答案的空间消耗,空间复杂度 $O(1)$。其中 $n$ 为数组 ` nums ` 的长度。
73
95
74
96
<!-- tabs:start -->
75
97
81
103
class Solution :
82
104
def getAverages (self , nums : List[int ], k : int ) -> List[int ]:
83
105
n = len (nums)
84
- presum = [0 ] * (n + 1 )
106
+ ans = [- 1 ] * n
107
+ s = list (accumulate(nums, initial = 0 ))
85
108
for i in range (n):
86
- presum[i + 1 ] = presum[i] + nums[i]
87
- return [
88
- - 1
89
- if i - k < 0 or i + k >= n
90
- else (presum[i + k + 1 ] - presum[i - k]) // (k * 2 + 1 )
91
- for i in range (n)
92
- ]
109
+ if i - k >= 0 and i + k < n:
110
+ ans[i] = (s[i + k + 1 ] - s[i - k]) // (k << 1 | 1 )
111
+ return ans
112
+ ```
113
+
114
+ ``` python
115
+ class Solution :
116
+ def getAverages (self , nums : List[int ], k : int ) -> List[int ]:
117
+ s = 0
118
+ ans = [- 1 ] * len (nums)
119
+ for i, v in enumerate (nums):
120
+ s += v
121
+ if i >= k * 2 :
122
+ ans[i - k] = s // (k * 2 + 1 )
123
+ s -= nums[i - k * 2 ]
124
+ return ans
93
125
```
94
126
95
127
### ** Java**
@@ -100,42 +132,38 @@ class Solution:
100
132
class Solution {
101
133
public int [] getAverages (int [] nums , int k ) {
102
134
int n = nums. length;
103
- long [] presum = new long [n + 1 ];
135
+ long [] s = new long [n + 1 ];
104
136
for (int i = 0 ; i < n; ++ i) {
105
- presum [i + 1 ] = presum [i] + nums[i];
137
+ s [i + 1 ] = s [i] + nums[i];
106
138
}
107
139
int [] ans = new int [n];
140
+ Arrays . fill(ans, - 1 );
108
141
for (int i = 0 ; i < n; ++ i) {
109
- if (i - k < 0 || i + k >= n) {
110
- ans[i] = - 1 ;
111
- } else {
112
- ans[i] = (int ) ((presum[i + k + 1 ] - presum[i - k]) / (k * 2 + 1 ));
142
+ if (i - k >= 0 && i + k < n) {
143
+ ans[i] = (int ) ((s[i + k + 1 ] - s[i - k]) / (k << 1 | 1 ));
113
144
}
114
145
}
115
146
return ans;
116
147
}
117
148
}
118
149
```
119
150
120
- ### ** TypeScript**
121
-
122
- ``` ts
123
- function getAverages(nums : number [], k : number ): number [] {
124
- const n = nums .length ;
125
- const l = 2 * k + 1 ;
126
- let sum = 0 ;
127
- let ans = new Array (n ).fill (- 1 );
128
- for (let i = 0 ; i < n ; i ++ ) {
129
- sum += nums [i ];
130
- let shiftIndex = i - l ;
131
- if (shiftIndex > - 1 ) {
132
- sum -= nums [shiftIndex ];
133
- }
134
- if (i + 1 >= l ) {
135
- ans [i - k ] = Math .floor (sum / l );
151
+ ``` java
152
+ class Solution {
153
+ public int [] getAverages (int [] nums , int k ) {
154
+ int n = nums. length;
155
+ int [] ans = new int [n];
156
+ Arrays . fill(ans, - 1 );
157
+ long s = 0 ;
158
+ for (int i = 0 ; i < n; ++ i) {
159
+ s += nums[i];
160
+ if (i >= k * 2 ) {
161
+ ans[i - k] = (int ) (s / (k * 2 + 1 ));
162
+ s -= nums[i - k * 2 ];
163
+ }
136
164
}
165
+ return ans;
137
166
}
138
- return ans ;
139
167
}
140
168
```
141
169
@@ -146,12 +174,36 @@ class Solution {
146
174
public:
147
175
vector<int > getAverages(vector<int >& nums, int k) {
148
176
int n = nums.size();
149
- vector<long long > presum(n + 1);
150
- for (int i = 0; i < n; ++i) presum[ i + 1] = presum[ i] + nums[ i] ;
177
+ long s[ n + 1] ;
178
+ s[ 0] = 0;
179
+ for (int i = 0; i < n; ++i) {
180
+ s[ i + 1] = s[ i] + nums[ i] ;
181
+ }
151
182
vector<int > ans(n, -1);
152
- for (int i = 0; i < n; ++i)
153
- if (i - k >= 0 && i + k < n)
154
- ans[ i] = (presum[ i + k + 1] - presum[ i - k] ) * 1ll / (k * 2 + 1);
183
+ for (int i = 0; i < n; ++i) {
184
+ if (i - k >= 0 && i + k < n) {
185
+ ans[ i] = (s[ i + k + 1] - s[ i - k] ) / (k << 1 | 1);
186
+ }
187
+ }
188
+ return ans;
189
+ }
190
+ };
191
+ ```
192
+
193
+ ```cpp
194
+ class Solution {
195
+ public:
196
+ vector<int> getAverages(vector<int>& nums, int k) {
197
+ int n = nums.size();
198
+ vector<int> ans(n, -1);
199
+ long s = 0;
200
+ for (int i = 0; i < n; ++i) {
201
+ s += nums[i];
202
+ if (i >= k * 2) {
203
+ ans[i - k] = s / (k * 2 + 1);
204
+ s -= nums[i - k * 2];
205
+ }
206
+ }
155
207
return ans;
156
208
}
157
209
};
@@ -162,22 +214,72 @@ public:
162
214
``` go
163
215
func getAverages (nums []int , k int ) []int {
164
216
n := len (nums)
165
- presum := make([]int64 , n+1)
166
- for i, num := range nums {
167
- presum [i+1] = presum [i] + int64(num)
217
+ s := make ([]int , n+1 )
218
+ for i , v := range nums {
219
+ s [i+1 ] = s [i] + v
168
220
}
169
- var ans []int
221
+ ans := make ( []int , n)
170
222
for i := 0 ; i < n; i++ {
171
- if i-k < 0 || i+k >= n {
172
- ans = append(ans, -1)
173
- } else {
174
- ans = append(ans, int((presum[i+k+1]-presum[i-k])/int64(k*2+1)))
223
+ ans[i] = -1
224
+ if i-k >= 0 && i+k < n {
225
+ ans[i] = (s[i+k+1 ] - s[i-k]) / (k<<1 | 1 )
175
226
}
176
227
}
177
228
return ans
178
229
}
179
230
```
180
231
232
+ ``` go
233
+ func getAverages (nums []int , k int ) []int {
234
+ ans := make ([]int , len (nums))
235
+ s := 0
236
+ for i , v := range nums {
237
+ ans[i] = -1
238
+ s += v
239
+ if i >= k*2 {
240
+ ans[i-k] = s / (k*2 + 1 )
241
+ s -= nums[i-k*2 ]
242
+ }
243
+ }
244
+ return ans
245
+ }
246
+ ```
247
+
248
+ ### ** TypeScript**
249
+
250
+ ``` ts
251
+ function getAverages(nums : number [], k : number ): number [] {
252
+ const n = nums .length ;
253
+ const s = new Array (n + 1 ).fill (0 );
254
+ for (let i = 0 ; i < n ; ++ i ) {
255
+ s [i + 1 ] = s [i ] + nums [i ];
256
+ }
257
+ const ans: number [] = new Array (n ).fill (- 1 );
258
+ for (let i = 0 ; i < n ; ++ i ) {
259
+ if (i - k >= 0 && i + k < n ) {
260
+ ans [i ] = Math .floor ((s [i + k + 1 ] - s [i - k ]) / ((k << 1 ) | 1 ));
261
+ }
262
+ }
263
+ return ans ;
264
+ }
265
+ ```
266
+
267
+ ``` ts
268
+ function getAverages(nums : number [], k : number ): number [] {
269
+ const n = nums .length ;
270
+ const ans: number [] = new Array (n ).fill (- 1 );
271
+ let s = 0 ;
272
+ for (let i = 0 ; i < n ; ++ i ) {
273
+ s += nums [i ];
274
+ if (i >= k * 2 ) {
275
+ ans [i - k ] = Math .floor (s / (k * 2 + 1 ));
276
+ s -= nums [i - k * 2 ];
277
+ }
278
+ }
279
+ return ans ;
280
+ }
281
+ ```
282
+
181
283
### ** ...**
182
284
183
285
```
0 commit comments