@@ -84,21 +84,17 @@ tags:
8484
8585<!-- solution:start -->
8686
87- ### 方法一:滑动窗口(写法一)
87+ ### 方法一:滑动窗口
8888
89- 半径为 $k$ 的子数组个数为 $k \times 2 + 1$,因此,我们不妨将 $k \times 2 + 1$ 记为 $k $。
89+ 半径为 $k$ 的子数组的长度为 $k \times 2 + 1$,因此我们可以维护一个大小为 $k \times 2 + 1$ 的窗口,记窗口中的所有元素和为 $s $。
9090
91- 我们创建一个长度为 $n$ 的答案数组 $ans$,初始时每项元素均为 $-1$。
91+ 我们创建一个长度为 $n$ 的答案数组 $\textit{ ans}$,初始时每个元素都为 $-1$。
9292
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$ 中移出。继续遍历下个元素。
9894
9995最后返回答案数组即可。
10096
101- 时间复杂度 $O(n)$,其中 $n$ 为数组 ` nums ` 的长度。忽略答案的空间消耗 ,空间复杂度 $O(1)$。
97+ 时间复杂度 $O(n)$,其中 $n$ 为数组 $\textit{ nums}$ 的长度。忽略答案数组的空间消耗 ,空间复杂度 $O(1)$。
10298
10399<!-- tabs:start -->
104100
@@ -107,150 +103,11 @@ tags:
107103``` python
108104class Solution :
109105 def getAverages (self , nums : List[int ], k : int ) -> List[int ]:
110- k = k << 1 | 1
111106 n = len (nums)
112107 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 ]:
250108 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
254111 if i >= k * 2 :
255112 ans[i - k] = s // (k * 2 + 1 )
256113 s -= nums[i - k * 2 ]
@@ -286,7 +143,7 @@ public:
286143 vector<int > getAverages(vector<int >& nums, int k) {
287144 int n = nums.size();
288145 vector<int > ans(n, -1);
289- long s = 0;
146+ long long s = 0;
290147 for (int i = 0; i < n; ++i) {
291148 s += nums[ i] ;
292149 if (i >= k * 2) {
@@ -304,10 +161,12 @@ public:
304161```go
305162func getAverages(nums []int, k int) []int {
306163 ans := make([]int, len(nums))
307- s := 0
308- for i, v := range nums {
164+ for i := range ans {
309165 ans[i] = -1
310- s += v
166+ }
167+ s := 0
168+ for i, x := range nums {
169+ s += x
311170 if i >= k*2 {
312171 ans[i-k] = s / (k*2 + 1)
313172 s -= nums[i-k*2]
@@ -322,7 +181,7 @@ func getAverages(nums []int, k int) []int {
322181``` ts
323182function getAverages(nums : number [], k : number ): number [] {
324183 const n = nums .length ;
325- const ans: number [] = new Array (n ).fill (- 1 );
184+ const ans: number [] = Array (n ).fill (- 1 );
326185 let s = 0 ;
327186 for (let i = 0 ; i < n ; ++ i ) {
328187 s += nums [i ];
0 commit comments