Skip to content

Commit 3c5c2d6

Browse files
authored
feat: add solutions to lc problem: No.2831 (doocs#2870)
No.2831.Find the Longest Equal Subarray
1 parent c954041 commit 3c5c2d6

File tree

8 files changed

+349
-3
lines changed

8 files changed

+349
-3
lines changed

.github/workflows/deploy.yml

-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ on:
44
push:
55
branches:
66
- main
7-
- docs
87
paths:
9-
- package.json
10-
- requirements.txt
118
- solution/**
129
- lcs/**
1310
- lcp/**

solution/2800-2899/2831.Find the Longest Equal Subarray/README.md

+130
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,134 @@ function longestEqualSubarray(nums: number[], k: number): number {
179179

180180
<!-- solution:end -->
181181

182+
<!-- solution:start -->
183+
184+
### 方法二:哈希表 + 双指针(写法二)
185+
186+
我们可以用一个哈希表 $g$ 维护每个元素的下标列表。
187+
188+
接下来,我们枚举每个元素作为等值元素,我们从哈希表 $g$ 中取出这个元素的下标列表 $ids$,然后我们定义两个指针 $l$ 和 $r$,用于维护一个窗口,使得窗口内的元素个数减去等值元素的个数,结果不超过 $k$。那么我们只需要求出最大的满足条件的窗口即可。
189+
190+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组的长度。
191+
192+
<!-- tabs:start -->
193+
194+
#### Python3
195+
196+
```python
197+
class Solution:
198+
def longestEqualSubarray(self, nums: List[int], k: int) -> int:
199+
g = defaultdict(list)
200+
for i, x in enumerate(nums):
201+
g[x].append(i)
202+
ans = 0
203+
for ids in g.values():
204+
l = 0
205+
for r in range(len(ids)):
206+
while ids[r] - ids[l] - (r - l) > k:
207+
l += 1
208+
ans = max(ans, r - l + 1)
209+
return ans
210+
```
211+
212+
#### Java
213+
214+
```java
215+
class Solution {
216+
public int longestEqualSubarray(List<Integer> nums, int k) {
217+
int n = nums.size();
218+
List<Integer>[] g = new List[n + 1];
219+
Arrays.setAll(g, i -> new ArrayList<>());
220+
for (int i = 0; i < n; ++i) {
221+
g[nums.get(i)].add(i);
222+
}
223+
int ans = 0;
224+
for (List<Integer> ids : g) {
225+
int l = 0;
226+
for (int r = 0; r < ids.size(); ++r) {
227+
while (ids.get(r) - ids.get(l) - (r - l) > k) {
228+
++l;
229+
}
230+
ans = Math.max(ans, r - l + 1);
231+
}
232+
}
233+
return ans;
234+
}
235+
}
236+
```
237+
238+
#### C++
239+
240+
```cpp
241+
class Solution {
242+
public:
243+
int longestEqualSubarray(vector<int>& nums, int k) {
244+
int n = nums.size();
245+
vector<int> g[n + 1];
246+
for (int i = 0; i < n; ++i) {
247+
g[nums[i]].push_back(i);
248+
}
249+
int ans = 0;
250+
for (const auto& ids : g) {
251+
int l = 0;
252+
for (int r = 0; r < ids.size(); ++r) {
253+
while (ids[r] - ids[l] - (r - l) > k) {
254+
++l;
255+
}
256+
ans = max(ans, r - l + 1);
257+
}
258+
}
259+
return ans;
260+
}
261+
};
262+
```
263+
264+
#### Go
265+
266+
```go
267+
func longestEqualSubarray(nums []int, k int) (ans int) {
268+
g := make([][]int, len(nums)+1)
269+
for i, x := range nums {
270+
g[x] = append(g[x], i)
271+
}
272+
for _, ids := range g {
273+
l := 0
274+
for r := range ids {
275+
for ids[r]-ids[l]-(r-l) > k {
276+
l++
277+
}
278+
ans = max(ans, r-l+1)
279+
}
280+
}
281+
return
282+
}
283+
```
284+
285+
#### TypeScript
286+
287+
```ts
288+
function longestEqualSubarray(nums: number[], k: number): number {
289+
const n = nums.length;
290+
const g: number[][] = Array.from({ length: n + 1 }, () => []);
291+
for (let i = 0; i < n; ++i) {
292+
g[nums[i]].push(i);
293+
}
294+
let ans = 0;
295+
for (const ids of g) {
296+
let l = 0;
297+
for (let r = 0; r < ids.length; ++r) {
298+
while (ids[r] - ids[l] - (r - l) > k) {
299+
++l;
300+
}
301+
ans = Math.max(ans, r - l + 1);
302+
}
303+
}
304+
return ans;
305+
}
306+
```
307+
308+
<!-- tabs:end -->
309+
310+
<!-- solution:end -->
311+
182312
<!-- problem:end -->

solution/2800-2899/2831.Find the Longest Equal Subarray/README_EN.md

+130
Original file line numberDiff line numberDiff line change
@@ -177,4 +177,134 @@ function longestEqualSubarray(nums: number[], k: number): number {
177177

178178
<!-- solution:end -->
179179

180+
<!-- source:start -->
181+
182+
### Solution 2: Hash Table + Two Pointers (Method 2)
183+
184+
We can use a hash table $g$ to maintain the index list of each element.
185+
186+
Next, we enumerate each element as the equal value element. We take out the index list $ids$ of this element from the hash table $g$. Then we define two pointers $l$ and $r$ to maintain a window, so that the number of elements in the window minus the number of equal value elements does not exceed $k$. Therefore, we only need to find the largest window that meets the condition.
187+
188+
The time complexity is $O(n)$, and the space complexity is $O(n)$. Where $n$ is the length of the array.
189+
190+
<!-- tabs:start -->
191+
192+
#### Python3
193+
194+
```python
195+
class Solution:
196+
def longestEqualSubarray(self, nums: List[int], k: int) -> int:
197+
g = defaultdict(list)
198+
for i, x in enumerate(nums):
199+
g[x].append(i)
200+
ans = 0
201+
for ids in g.values():
202+
l = 0
203+
for r in range(len(ids)):
204+
while ids[r] - ids[l] - (r - l) > k:
205+
l += 1
206+
ans = max(ans, r - l + 1)
207+
return ans
208+
```
209+
210+
#### Java
211+
212+
```java
213+
class Solution {
214+
public int longestEqualSubarray(List<Integer> nums, int k) {
215+
int n = nums.size();
216+
List<Integer>[] g = new List[n + 1];
217+
Arrays.setAll(g, i -> new ArrayList<>());
218+
for (int i = 0; i < n; ++i) {
219+
g[nums.get(i)].add(i);
220+
}
221+
int ans = 0;
222+
for (List<Integer> ids : g) {
223+
int l = 0;
224+
for (int r = 0; r < ids.size(); ++r) {
225+
while (ids.get(r) - ids.get(l) - (r - l) > k) {
226+
++l;
227+
}
228+
ans = Math.max(ans, r - l + 1);
229+
}
230+
}
231+
return ans;
232+
}
233+
}
234+
```
235+
236+
#### C++
237+
238+
```cpp
239+
class Solution {
240+
public:
241+
int longestEqualSubarray(vector<int>& nums, int k) {
242+
int n = nums.size();
243+
vector<int> g[n + 1];
244+
for (int i = 0; i < n; ++i) {
245+
g[nums[i]].push_back(i);
246+
}
247+
int ans = 0;
248+
for (const auto& ids : g) {
249+
int l = 0;
250+
for (int r = 0; r < ids.size(); ++r) {
251+
while (ids[r] - ids[l] - (r - l) > k) {
252+
++l;
253+
}
254+
ans = max(ans, r - l + 1);
255+
}
256+
}
257+
return ans;
258+
}
259+
};
260+
```
261+
262+
#### Go
263+
264+
```go
265+
func longestEqualSubarray(nums []int, k int) (ans int) {
266+
g := make([][]int, len(nums)+1)
267+
for i, x := range nums {
268+
g[x] = append(g[x], i)
269+
}
270+
for _, ids := range g {
271+
l := 0
272+
for r := range ids {
273+
for ids[r]-ids[l]-(r-l) > k {
274+
l++
275+
}
276+
ans = max(ans, r-l+1)
277+
}
278+
}
279+
return
280+
}
281+
```
282+
283+
#### TypeScript
284+
285+
```ts
286+
function longestEqualSubarray(nums: number[], k: number): number {
287+
const n = nums.length;
288+
const g: number[][] = Array.from({ length: n + 1 }, () => []);
289+
for (let i = 0; i < n; ++i) {
290+
g[nums[i]].push(i);
291+
}
292+
let ans = 0;
293+
for (const ids of g) {
294+
let l = 0;
295+
for (let r = 0; r < ids.length; ++r) {
296+
while (ids[r] - ids[l] - (r - l) > k) {
297+
++l;
298+
}
299+
ans = Math.max(ans, r - l + 1);
300+
}
301+
}
302+
return ans;
303+
}
304+
```
305+
306+
<!-- tabs:end -->
307+
308+
<!-- solution:end -->
309+
180310
<!-- problem:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
int longestEqualSubarray(vector<int>& nums, int k) {
4+
int n = nums.size();
5+
vector<int> g[n + 1];
6+
for (int i = 0; i < n; ++i) {
7+
g[nums[i]].push_back(i);
8+
}
9+
int ans = 0;
10+
for (const auto& ids : g) {
11+
int l = 0;
12+
for (int r = 0; r < ids.size(); ++r) {
13+
while (ids[r] - ids[l] - (r - l) > k) {
14+
++l;
15+
}
16+
ans = max(ans, r - l + 1);
17+
}
18+
}
19+
return ans;
20+
}
21+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
func longestEqualSubarray(nums []int, k int) (ans int) {
2+
g := make([][]int, len(nums)+1)
3+
for i, x := range nums {
4+
g[x] = append(g[x], i)
5+
}
6+
for _, ids := range g {
7+
l := 0
8+
for r := range ids {
9+
for ids[r]-ids[l]-(r-l) > k {
10+
l++
11+
}
12+
ans = max(ans, r-l+1)
13+
}
14+
}
15+
return
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public int longestEqualSubarray(List<Integer> nums, int k) {
3+
int n = nums.size();
4+
List<Integer>[] g = new List[n + 1];
5+
Arrays.setAll(g, i -> new ArrayList<>());
6+
for (int i = 0; i < n; ++i) {
7+
g[nums.get(i)].add(i);
8+
}
9+
int ans = 0;
10+
for (List<Integer> ids : g) {
11+
int l = 0;
12+
for (int r = 0; r < ids.size(); ++r) {
13+
while (ids.get(r) - ids.get(l) - (r - l) > k) {
14+
++l;
15+
}
16+
ans = Math.max(ans, r - l + 1);
17+
}
18+
}
19+
return ans;
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def longestEqualSubarray(self, nums: List[int], k: int) -> int:
3+
g = defaultdict(list)
4+
for i, x in enumerate(nums):
5+
g[x].append(i)
6+
ans = 0
7+
for ids in g.values():
8+
l = 0
9+
for r in range(len(ids)):
10+
while ids[r] - ids[l] - (r - l) > k:
11+
l += 1
12+
ans = max(ans, r - l + 1)
13+
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function longestEqualSubarray(nums: number[], k: number): number {
2+
const n = nums.length;
3+
const g: number[][] = Array.from({ length: n + 1 }, () => []);
4+
for (let i = 0; i < n; ++i) {
5+
g[nums[i]].push(i);
6+
}
7+
let ans = 0;
8+
for (const ids of g) {
9+
let l = 0;
10+
for (let r = 0; r < ids.length; ++r) {
11+
while (ids[r] - ids[l] - (r - l) > k) {
12+
++l;
13+
}
14+
ans = Math.max(ans, r - l + 1);
15+
}
16+
}
17+
return ans;
18+
}

0 commit comments

Comments
 (0)