Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit cd3a6d1

Browse files
authored
feat: update solutions to lc problem: No.1566 (doocs#3562)
No.1566.Detect Pattern of Length M Repeated K or More Times
1 parent 46c5add commit cd3a6d1

File tree

7 files changed

+166
-142
lines changed

7 files changed

+166
-142
lines changed

solution/1500-1599/1566.Detect Pattern of Length M Repeated K or More Times/README.md

Lines changed: 56 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,15 @@ tags:
7979

8080
<!-- solution:start -->
8181

82-
### 方法一:枚举
82+
### 方法一:一次遍历
8383

84-
枚举数组的左端点 `i`,判断是否存在一个 `i`,满足对于任意 `j∈[0, m * k)``arr[i + j] == arr[i + (j % m)]`。存在则返回 `true`,否则返回 `false`
84+
首先,如果数组的长度小于 $m \times k$,那么肯定不存在长度为 $m$ 且至少重复 $k$ 次的模式,直接返回 $\textit{false}$
8585

86-
时间复杂度 $O((n-m\times k)\times m \times k)$。
86+
接下来,我们定义一个变量 $\textit{cnt}$ 来记录当前连续重复的次数,如果数组存在连续的 $(k - 1) \times m$ 个元素 $a_i$,使得 $a_i = a_{i - m}$,那么我们就找到了一个长度为 $m$ 且至少重复 $k$ 次的模式,返回 $\textit{true}$。否则,我们将 $\textit{cnt}$ 置为 $0$,继续遍历数组。
87+
88+
最后,如果遍历完数组都没有找到符合条件的模式,返回 $\textit{false}$。
89+
90+
时间复杂度 $O(n)$,其中 $n$ 是数组的长度。空间复杂度 $O(1)$。
8791

8892
<!-- tabs:start -->
8993

@@ -92,15 +96,16 @@ tags:
9296
```python
9397
class Solution:
9498
def containsPattern(self, arr: List[int], m: int, k: int) -> bool:
95-
n = len(arr)
96-
for i in range(n - m * k + 1):
97-
j = 0
98-
while j < m * k:
99-
if arr[i + j] != arr[i + (j % m)]:
100-
break
101-
j += 1
102-
if j == m * k:
103-
return True
99+
if len(arr) < m * k:
100+
return False
101+
cnt, target = 0, (k - 1) * m
102+
for i in range(m, len(arr)):
103+
if arr[i] == arr[i - m]:
104+
cnt += 1
105+
if cnt == target:
106+
return True
107+
else:
108+
cnt = 0
104109
return False
105110
```
106111

@@ -109,16 +114,17 @@ class Solution:
109114
```java
110115
class Solution {
111116
public boolean containsPattern(int[] arr, int m, int k) {
112-
int n = arr.length;
113-
for (int i = 0; i <= n - m * k; ++i) {
114-
int j = 0;
115-
for (; j < m * k; ++j) {
116-
if (arr[i + j] != arr[i + (j % m)]) {
117-
break;
117+
if (arr.length < m * k) {
118+
return false;
119+
}
120+
int cnt = 0, target = (k - 1) * m;
121+
for (int i = m; i < arr.length; ++i) {
122+
if (arr[i] == arr[i - m]) {
123+
if (++cnt == target) {
124+
return true;
118125
}
119-
}
120-
if (j == m * k) {
121-
return true;
126+
} else {
127+
cnt = 0;
122128
}
123129
}
124130
return false;
@@ -132,16 +138,17 @@ class Solution {
132138
class Solution {
133139
public:
134140
bool containsPattern(vector<int>& arr, int m, int k) {
135-
int n = arr.size();
136-
for (int i = 0; i <= n - m * k; ++i) {
137-
int j = 0;
138-
for (; j < m * k; ++j) {
139-
if (arr[i + j] != arr[i + (j % m)]) {
140-
break;
141+
if (arr.size() < m * k) {
142+
return false;
143+
}
144+
int cnt = 0, target = (k - 1) * m;
145+
for (int i = m; i < arr.size(); ++i) {
146+
if (arr[i] == arr[i - m]) {
147+
if (++cnt == target) {
148+
return true;
141149
}
142-
}
143-
if (j == m * k) {
144-
return true;
150+
} else {
151+
cnt = 0;
145152
}
146153
}
147154
return false;
@@ -153,16 +160,15 @@ public:
153160
154161
```go
155162
func containsPattern(arr []int, m int, k int) bool {
156-
n := len(arr)
157-
for i := 0; i <= n-m*k; i++ {
158-
j := 0
159-
for ; j < m*k; j++ {
160-
if arr[i+j] != arr[i+(j%m)] {
161-
break
163+
cnt, target := 0, (k-1)*m
164+
for i := m; i < len(arr); i++ {
165+
if arr[i] == arr[i-m] {
166+
cnt++
167+
if cnt == target {
168+
return true
162169
}
163-
}
164-
if j == m*k {
165-
return true
170+
} else {
171+
cnt = 0
166172
}
167173
}
168174
return false
@@ -173,16 +179,18 @@ func containsPattern(arr []int, m int, k int) bool {
173179

174180
```ts
175181
function containsPattern(arr: number[], m: number, k: number): boolean {
176-
const n = arr.length;
177-
for (let i = 0; i <= n - m * k; ++i) {
178-
let j = 0;
179-
for (; j < m * k; ++j) {
180-
if (arr[i + j] != arr[i + (j % m)]) {
181-
break;
182+
if (arr.length < m * k) {
183+
return false;
184+
}
185+
const target = (k - 1) * m;
186+
let cnt = 0;
187+
for (let i = m; i < arr.length; ++i) {
188+
if (arr[i] === arr[i - m]) {
189+
if (++cnt === target) {
190+
return true;
182191
}
183-
}
184-
if (j == m * k) {
185-
return true;
192+
} else {
193+
cnt = 0;
186194
}
187195
}
188196
return false;

solution/1500-1599/1566.Detect Pattern of Length M Repeated K or More Times/README_EN.md

Lines changed: 58 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,15 @@ tags:
6666

6767
<!-- solution:start -->
6868

69-
### Solution 1
69+
### Solution 1: Single Traversal
70+
71+
First, if the length of the array is less than $m \times k$, then there is definitely no pattern of length $m$ that repeats at least $k$ times, so we directly return $\textit{false}$.
72+
73+
Next, we define a variable $\textit{cnt}$ to record the current count of consecutive repetitions. If there are $(k - 1) \times m$ consecutive elements $a_i$ in the array such that $a_i = a_{i - m}$, then we have found a pattern of length $m$ that repeats at least $k$ times, and we return $\textit{true}$. Otherwise, we reset $\textit{cnt}$ to $0$ and continue traversing the array.
74+
75+
Finally, if we finish traversing the array without finding a pattern that meets the conditions, we return $\textit{false}$.
76+
77+
The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.
7078

7179
<!-- tabs:start -->
7280

@@ -75,15 +83,16 @@ tags:
7583
```python
7684
class Solution:
7785
def containsPattern(self, arr: List[int], m: int, k: int) -> bool:
78-
n = len(arr)
79-
for i in range(n - m * k + 1):
80-
j = 0
81-
while j < m * k:
82-
if arr[i + j] != arr[i + (j % m)]:
83-
break
84-
j += 1
85-
if j == m * k:
86-
return True
86+
if len(arr) < m * k:
87+
return False
88+
cnt, target = 0, (k - 1) * m
89+
for i in range(m, len(arr)):
90+
if arr[i] == arr[i - m]:
91+
cnt += 1
92+
if cnt == target:
93+
return True
94+
else:
95+
cnt = 0
8796
return False
8897
```
8998

@@ -92,16 +101,17 @@ class Solution:
92101
```java
93102
class Solution {
94103
public boolean containsPattern(int[] arr, int m, int k) {
95-
int n = arr.length;
96-
for (int i = 0; i <= n - m * k; ++i) {
97-
int j = 0;
98-
for (; j < m * k; ++j) {
99-
if (arr[i + j] != arr[i + (j % m)]) {
100-
break;
104+
if (arr.length < m * k) {
105+
return false;
106+
}
107+
int cnt = 0, target = (k - 1) * m;
108+
for (int i = m; i < arr.length; ++i) {
109+
if (arr[i] == arr[i - m]) {
110+
if (++cnt == target) {
111+
return true;
101112
}
102-
}
103-
if (j == m * k) {
104-
return true;
113+
} else {
114+
cnt = 0;
105115
}
106116
}
107117
return false;
@@ -115,16 +125,17 @@ class Solution {
115125
class Solution {
116126
public:
117127
bool containsPattern(vector<int>& arr, int m, int k) {
118-
int n = arr.size();
119-
for (int i = 0; i <= n - m * k; ++i) {
120-
int j = 0;
121-
for (; j < m * k; ++j) {
122-
if (arr[i + j] != arr[i + (j % m)]) {
123-
break;
128+
if (arr.size() < m * k) {
129+
return false;
130+
}
131+
int cnt = 0, target = (k - 1) * m;
132+
for (int i = m; i < arr.size(); ++i) {
133+
if (arr[i] == arr[i - m]) {
134+
if (++cnt == target) {
135+
return true;
124136
}
125-
}
126-
if (j == m * k) {
127-
return true;
137+
} else {
138+
cnt = 0;
128139
}
129140
}
130141
return false;
@@ -136,16 +147,15 @@ public:
136147
137148
```go
138149
func containsPattern(arr []int, m int, k int) bool {
139-
n := len(arr)
140-
for i := 0; i <= n-m*k; i++ {
141-
j := 0
142-
for ; j < m*k; j++ {
143-
if arr[i+j] != arr[i+(j%m)] {
144-
break
150+
cnt, target := 0, (k-1)*m
151+
for i := m; i < len(arr); i++ {
152+
if arr[i] == arr[i-m] {
153+
cnt++
154+
if cnt == target {
155+
return true
145156
}
146-
}
147-
if j == m*k {
148-
return true
157+
} else {
158+
cnt = 0
149159
}
150160
}
151161
return false
@@ -156,16 +166,18 @@ func containsPattern(arr []int, m int, k int) bool {
156166

157167
```ts
158168
function containsPattern(arr: number[], m: number, k: number): boolean {
159-
const n = arr.length;
160-
for (let i = 0; i <= n - m * k; ++i) {
161-
let j = 0;
162-
for (; j < m * k; ++j) {
163-
if (arr[i + j] != arr[i + (j % m)]) {
164-
break;
169+
if (arr.length < m * k) {
170+
return false;
171+
}
172+
const target = (k - 1) * m;
173+
let cnt = 0;
174+
for (let i = m; i < arr.length; ++i) {
175+
if (arr[i] === arr[i - m]) {
176+
if (++cnt === target) {
177+
return true;
165178
}
166-
}
167-
if (j == m * k) {
168-
return true;
179+
} else {
180+
cnt = 0;
169181
}
170182
}
171183
return false;
Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
class Solution {
22
public:
33
bool containsPattern(vector<int>& arr, int m, int k) {
4-
int n = arr.size();
5-
for (int i = 0; i <= n - m * k; ++i) {
6-
int j = 0;
7-
for (; j < m * k; ++j) {
8-
if (arr[i + j] != arr[i + (j % m)]) {
9-
break;
4+
if (arr.size() < m * k) {
5+
return false;
6+
}
7+
int cnt = 0, target = (k - 1) * m;
8+
for (int i = m; i < arr.size(); ++i) {
9+
if (arr[i] == arr[i - m]) {
10+
if (++cnt == target) {
11+
return true;
1012
}
11-
}
12-
if (j == m * k) {
13-
return true;
13+
} else {
14+
cnt = 0;
1415
}
1516
}
1617
return false;
1718
}
18-
};
19+
};
Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
func containsPattern(arr []int, m int, k int) bool {
2-
n := len(arr)
3-
for i := 0; i <= n-m*k; i++ {
4-
j := 0
5-
for ; j < m*k; j++ {
6-
if arr[i+j] != arr[i+(j%m)] {
7-
break
2+
cnt, target := 0, (k-1)*m
3+
for i := m; i < len(arr); i++ {
4+
if arr[i] == arr[i-m] {
5+
cnt++
6+
if cnt == target {
7+
return true
88
}
9-
}
10-
if j == m*k {
11-
return true
9+
} else {
10+
cnt = 0
1211
}
1312
}
1413
return false
15-
}
14+
}
Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
class Solution {
22
public boolean containsPattern(int[] arr, int m, int k) {
3-
int n = arr.length;
4-
for (int i = 0; i <= n - m * k; ++i) {
5-
int j = 0;
6-
for (; j < m * k; ++j) {
7-
if (arr[i + j] != arr[i + (j % m)]) {
8-
break;
3+
if (arr.length < m * k) {
4+
return false;
5+
}
6+
int cnt = 0, target = (k - 1) * m;
7+
for (int i = m; i < arr.length; ++i) {
8+
if (arr[i] == arr[i - m]) {
9+
if (++cnt == target) {
10+
return true;
911
}
10-
}
11-
if (j == m * k) {
12-
return true;
12+
} else {
13+
cnt = 0;
1314
}
1415
}
1516
return false;
1617
}
17-
}
18+
}

0 commit comments

Comments
 (0)