Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: update solutions to lc problem: No.1566 #3562

Merged
merged 1 commit into from
Sep 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,15 @@ tags:

<!-- solution:start -->

### 方法一:枚举
### 方法一:一次遍历

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

时间复杂度 $O((n-m\times k)\times m \times k)$。
接下来,我们定义一个变量 $\textit{cnt}$ 来记录当前连续重复的次数,如果数组存在连续的 $(k - 1) \times m$ 个元素 $a_i$,使得 $a_i = a_{i - m}$,那么我们就找到了一个长度为 $m$ 且至少重复 $k$ 次的模式,返回 $\textit{true}$。否则,我们将 $\textit{cnt}$ 置为 $0$,继续遍历数组。

最后,如果遍历完数组都没有找到符合条件的模式,返回 $\textit{false}$。

时间复杂度 $O(n)$,其中 $n$ 是数组的长度。空间复杂度 $O(1)$。

<!-- tabs:start -->

Expand All @@ -92,15 +96,16 @@ tags:
```python
class Solution:
def containsPattern(self, arr: List[int], m: int, k: int) -> bool:
n = len(arr)
for i in range(n - m * k + 1):
j = 0
while j < m * k:
if arr[i + j] != arr[i + (j % m)]:
break
j += 1
if j == m * k:
return True
if len(arr) < m * k:
return False
cnt, target = 0, (k - 1) * m
for i in range(m, len(arr)):
if arr[i] == arr[i - m]:
cnt += 1
if cnt == target:
return True
else:
cnt = 0
return False
```

Expand All @@ -109,16 +114,17 @@ class Solution:
```java
class Solution {
public boolean containsPattern(int[] arr, int m, int k) {
int n = arr.length;
for (int i = 0; i <= n - m * k; ++i) {
int j = 0;
for (; j < m * k; ++j) {
if (arr[i + j] != arr[i + (j % m)]) {
break;
if (arr.length < m * k) {
return false;
}
int cnt = 0, target = (k - 1) * m;
for (int i = m; i < arr.length; ++i) {
if (arr[i] == arr[i - m]) {
if (++cnt == target) {
return true;
}
}
if (j == m * k) {
return true;
} else {
cnt = 0;
}
}
return false;
Expand All @@ -132,16 +138,17 @@ class Solution {
class Solution {
public:
bool containsPattern(vector<int>& arr, int m, int k) {
int n = arr.size();
for (int i = 0; i <= n - m * k; ++i) {
int j = 0;
for (; j < m * k; ++j) {
if (arr[i + j] != arr[i + (j % m)]) {
break;
if (arr.size() < m * k) {
return false;
}
int cnt = 0, target = (k - 1) * m;
for (int i = m; i < arr.size(); ++i) {
if (arr[i] == arr[i - m]) {
if (++cnt == target) {
return true;
}
}
if (j == m * k) {
return true;
} else {
cnt = 0;
}
}
return false;
Expand All @@ -153,16 +160,15 @@ public:

```go
func containsPattern(arr []int, m int, k int) bool {
n := len(arr)
for i := 0; i <= n-m*k; i++ {
j := 0
for ; j < m*k; j++ {
if arr[i+j] != arr[i+(j%m)] {
break
cnt, target := 0, (k-1)*m
for i := m; i < len(arr); i++ {
if arr[i] == arr[i-m] {
cnt++
if cnt == target {
return true
}
}
if j == m*k {
return true
} else {
cnt = 0
}
}
return false
Expand All @@ -173,16 +179,18 @@ func containsPattern(arr []int, m int, k int) bool {

```ts
function containsPattern(arr: number[], m: number, k: number): boolean {
const n = arr.length;
for (let i = 0; i <= n - m * k; ++i) {
let j = 0;
for (; j < m * k; ++j) {
if (arr[i + j] != arr[i + (j % m)]) {
break;
if (arr.length < m * k) {
return false;
}
const target = (k - 1) * m;
let cnt = 0;
for (let i = m; i < arr.length; ++i) {
if (arr[i] === arr[i - m]) {
if (++cnt === target) {
return true;
}
}
if (j == m * k) {
return true;
} else {
cnt = 0;
}
}
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,15 @@ tags:

<!-- solution:start -->

### Solution 1
### Solution 1: Single Traversal

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}$.

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.

Finally, if we finish traversing the array without finding a pattern that meets the conditions, we return $\textit{false}$.

The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.

<!-- tabs:start -->

Expand All @@ -75,15 +83,16 @@ tags:
```python
class Solution:
def containsPattern(self, arr: List[int], m: int, k: int) -> bool:
n = len(arr)
for i in range(n - m * k + 1):
j = 0
while j < m * k:
if arr[i + j] != arr[i + (j % m)]:
break
j += 1
if j == m * k:
return True
if len(arr) < m * k:
return False
cnt, target = 0, (k - 1) * m
for i in range(m, len(arr)):
if arr[i] == arr[i - m]:
cnt += 1
if cnt == target:
return True
else:
cnt = 0
return False
```

Expand All @@ -92,16 +101,17 @@ class Solution:
```java
class Solution {
public boolean containsPattern(int[] arr, int m, int k) {
int n = arr.length;
for (int i = 0; i <= n - m * k; ++i) {
int j = 0;
for (; j < m * k; ++j) {
if (arr[i + j] != arr[i + (j % m)]) {
break;
if (arr.length < m * k) {
return false;
}
int cnt = 0, target = (k - 1) * m;
for (int i = m; i < arr.length; ++i) {
if (arr[i] == arr[i - m]) {
if (++cnt == target) {
return true;
}
}
if (j == m * k) {
return true;
} else {
cnt = 0;
}
}
return false;
Expand All @@ -115,16 +125,17 @@ class Solution {
class Solution {
public:
bool containsPattern(vector<int>& arr, int m, int k) {
int n = arr.size();
for (int i = 0; i <= n - m * k; ++i) {
int j = 0;
for (; j < m * k; ++j) {
if (arr[i + j] != arr[i + (j % m)]) {
break;
if (arr.size() < m * k) {
return false;
}
int cnt = 0, target = (k - 1) * m;
for (int i = m; i < arr.size(); ++i) {
if (arr[i] == arr[i - m]) {
if (++cnt == target) {
return true;
}
}
if (j == m * k) {
return true;
} else {
cnt = 0;
}
}
return false;
Expand All @@ -136,16 +147,15 @@ public:

```go
func containsPattern(arr []int, m int, k int) bool {
n := len(arr)
for i := 0; i <= n-m*k; i++ {
j := 0
for ; j < m*k; j++ {
if arr[i+j] != arr[i+(j%m)] {
break
cnt, target := 0, (k-1)*m
for i := m; i < len(arr); i++ {
if arr[i] == arr[i-m] {
cnt++
if cnt == target {
return true
}
}
if j == m*k {
return true
} else {
cnt = 0
}
}
return false
Expand All @@ -156,16 +166,18 @@ func containsPattern(arr []int, m int, k int) bool {

```ts
function containsPattern(arr: number[], m: number, k: number): boolean {
const n = arr.length;
for (let i = 0; i <= n - m * k; ++i) {
let j = 0;
for (; j < m * k; ++j) {
if (arr[i + j] != arr[i + (j % m)]) {
break;
if (arr.length < m * k) {
return false;
}
const target = (k - 1) * m;
let cnt = 0;
for (let i = m; i < arr.length; ++i) {
if (arr[i] === arr[i - m]) {
if (++cnt === target) {
return true;
}
}
if (j == m * k) {
return true;
} else {
cnt = 0;
}
}
return false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
class Solution {
public:
bool containsPattern(vector<int>& arr, int m, int k) {
int n = arr.size();
for (int i = 0; i <= n - m * k; ++i) {
int j = 0;
for (; j < m * k; ++j) {
if (arr[i + j] != arr[i + (j % m)]) {
break;
if (arr.size() < m * k) {
return false;
}
int cnt = 0, target = (k - 1) * m;
for (int i = m; i < arr.size(); ++i) {
if (arr[i] == arr[i - m]) {
if (++cnt == target) {
return true;
}
}
if (j == m * k) {
return true;
} else {
cnt = 0;
}
}
return false;
}
};
};
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
func containsPattern(arr []int, m int, k int) bool {
n := len(arr)
for i := 0; i <= n-m*k; i++ {
j := 0
for ; j < m*k; j++ {
if arr[i+j] != arr[i+(j%m)] {
break
cnt, target := 0, (k-1)*m
for i := m; i < len(arr); i++ {
if arr[i] == arr[i-m] {
cnt++
if cnt == target {
return true
}
}
if j == m*k {
return true
} else {
cnt = 0
}
}
return false
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
class Solution {
public boolean containsPattern(int[] arr, int m, int k) {
int n = arr.length;
for (int i = 0; i <= n - m * k; ++i) {
int j = 0;
for (; j < m * k; ++j) {
if (arr[i + j] != arr[i + (j % m)]) {
break;
if (arr.length < m * k) {
return false;
}
int cnt = 0, target = (k - 1) * m;
for (int i = m; i < arr.length; ++i) {
if (arr[i] == arr[i - m]) {
if (++cnt == target) {
return true;
}
}
if (j == m * k) {
return true;
} else {
cnt = 0;
}
}
return false;
}
}
}
Loading
Loading