Skip to content

Commit 059ff27

Browse files
authored
feat: update solutions to lc problem: No.2090 (#3668)
1 parent e9ba978 commit 059ff27

File tree

12 files changed

+63
-437
lines changed

12 files changed

+63
-437
lines changed

solution/2000-2099/2090.K Radius Subarray Averages/README.md

+14-155
Original file line numberDiff line numberDiff line change
@@ -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
108104
class 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
305162
func 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
323182
function 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

Comments
 (0)