Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit cd3a6d1

Browse files
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+
ifarr[i] ==arr[i-m] {
5+
cnt++
6+
if cnt==target {
7+
returntrue
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)

AltStyle によって変換されたページ (->オリジナル) /