@@ -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 =  nums .length ;
210-     const :  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 =  nums .length ;
325-     const :  number [] =  new   Array (n ).fill (- 1 );
184+     const :  number [] =  Array (n ).fill (- 1 );
326185    let  s =  0 ;
327186    for  (let  i =  0 ; i  <  n ; ++ i ) {
328187        s  +=  nums [i ];
0 commit comments