53
53
54
54
## 解法
55
55
56
- ### 方法一
56
+ ### 方法一:枚举
57
+
58
+ 我们可以枚举数组 ` nums ` 的所有长度为 $m + 1$ 的子数组,然后判断是否满足模式数组 ` pattern ` ,如果满足则答案加一。
59
+
60
+ 时间复杂度 $O(n \times m)$,其中 $n$ 和 $m$ 分别是数组 ` nums ` 和 ` pattern ` 的长度。空间复杂度 $O(1)$。
57
61
58
62
<!-- tabs:start -->
59
63
60
64
``` python
61
65
class Solution :
62
66
def countMatchingSubarrays (self , nums : List[int ], pattern : List[int ]) -> int :
63
- n = len (nums)
64
- m = len (pattern)
65
- count = 0
66
- for i in range (n - m):
67
- flag = True
68
- for j in range (m):
69
- if (
70
- (pattern[j] == 1 and nums[i + j + 1 ] <= nums[i + j])
71
- or (pattern[j] == 0 and nums[i + j + 1 ] != nums[i + j])
72
- or (pattern[j] == - 1 and nums[i + j + 1 ] >= nums[i + j])
73
- ):
74
- flag = False
75
- break
76
- if flag:
77
- count += 1
78
- return count
67
+ def f (a : int , b : int ) -> int :
68
+ return 0 if a == b else (1 if a < b else - 1 )
69
+
70
+ ans = 0
71
+ for i in range (len (nums) - len (pattern)):
72
+ ans += all (
73
+ f(nums[i + k], nums[i + k + 1 ]) == p for k, p in enumerate (pattern)
74
+ )
75
+ return ans
79
76
```
80
77
81
78
``` java
82
79
class Solution {
83
80
public int countMatchingSubarrays (int [] nums , int [] pattern ) {
84
- int n = nums. length;
85
- int m = pattern. length;
86
- int count = 0 ;
87
- for (int i = 0 ; i <= n - m - 1 ; i++ ) {
88
- boolean flag = true ;
89
- for (int j = 0 ; j < m; j++ ) {
90
- if ((pattern[j] == 1 && nums[i + j + 1 ] <= nums[i + j]) ||
91
- (pattern[j] == 0 && nums[i + j + 1 ] != nums[i + j]) ||
92
- (pattern[j] == - 1 && nums[i + j + 1 ] >= nums[i + j])) {
93
- flag = false ;
94
- break ;
81
+ int n = nums. length, m = pattern. length;
82
+ int ans = 0 ;
83
+ for (int i = 0 ; i < n - m; ++ i) {
84
+ int ok = 1 ;
85
+ for (int k = 0 ; k < m && ok == 1 ; ++ k) {
86
+ if (f(nums[i + k], nums[i + k + 1 ]) != pattern[k]) {
87
+ ok = 0 ;
95
88
}
96
89
}
97
- if (flag) {
98
- count++ ;
99
- }
90
+ ans += ok;
100
91
}
101
- return count;
92
+ return ans;
93
+ }
94
+
95
+ private int f (int a , int b ) {
96
+ return a == b ? 0 : (a < b ? 1 : - 1 );
102
97
}
103
98
}
104
99
```
@@ -107,71 +102,89 @@ class Solution {
107
102
class Solution {
108
103
public:
109
104
int countMatchingSubarrays(vector<int >& nums, vector<int >& pattern) {
110
- int n = nums.size();
111
- int m = pattern.size();
112
- int c = 0;
113
- for (int i = 0; i <= n - m - 1; i++) {
114
- bool flag = true;
115
- for (int j = 0; j < m; j++) {
116
- if ((pattern[ j] == 1 && nums[ i + j + 1] <= nums[ i + j] ) || (pattern[ j] == 0 && nums[ i + j + 1] != nums[ i + j] ) || (pattern[ j] == -1 && nums[ i + j + 1] >= nums[ i + j] )) {
117
- flag = false;
118
- break;
105
+ int n = nums.size(), m = pattern.size();
106
+ int ans = 0;
107
+ auto f = [ ] (int a, int b) {
108
+ return a == b ? 0 : (a < b ? 1 : -1);
109
+ };
110
+ for (int i = 0; i < n - m; ++i) {
111
+ int ok = 1;
112
+ for (int k = 0; k < m && ok == 1; ++k) {
113
+ if (f(nums[ i + k] , nums[ i + k + 1] ) != pattern[ k] ) {
114
+ ok = 0;
119
115
}
120
116
}
121
- if (flag) {
122
- c++;
123
- }
117
+ ans += ok;
124
118
}
125
- return c ;
119
+ return ans ;
126
120
}
127
121
};
128
122
```
129
123
130
124
```go
131
- func countMatchingSubarrays(nums []int, pattern []int) int {
132
- n := len(nums)
133
- m := len(pattern)
134
- count := 0
135
- for i := 0; i <= n-m-1; i++ {
136
- flag := true
137
- for j := 0; j < m; j++ {
138
- if (pattern[j] == 1 && nums[i+j+1] <= nums[i+j]) ||
139
- (pattern[j] == 0 && nums[i+j+1] != nums[i+j]) ||
140
- (pattern[j] == -1 && nums[i+j+1] >= nums[i+j]) {
141
- flag = false
142
- break
143
- }
125
+ func countMatchingSubarrays(nums []int, pattern []int) (ans int) {
126
+ f := func(a, b int) int {
127
+ if a == b {
128
+ return 0
144
129
}
145
- if flag {
146
- count++
130
+ if a < b {
131
+ return 1
132
+ }
133
+ return -1
134
+ }
135
+ n, m := len(nums), len(pattern)
136
+ for i := 0; i < n-m; i++ {
137
+ ok := 1
138
+ for k := 0; k < m && ok == 1; k++ {
139
+ if f(nums[i+k], nums[i+k+1]) != pattern[k] {
140
+ ok = 0
141
+ }
147
142
}
143
+ ans += ok
148
144
}
149
- return count
145
+ return
150
146
}
151
147
```
152
148
153
149
``` ts
154
150
function countMatchingSubarrays(nums : number [], pattern : number []): number {
155
- const n: number = nums .length ;
156
- const m: number = pattern .length ;
157
- let count: number = 0 ;
158
- for (let i = 0 ; i <= n - m - 1 ; i ++ ) {
159
- let flag: boolean = true ;
160
- for (let j = 0 ; j < m ; j ++ ) {
161
- if (
162
- (pattern [j ] === 1 && nums [i + j + 1 ] <= nums [i + j ]) ||
163
- (pattern [j ] === 0 && nums [i + j + 1 ] !== nums [i + j ]) ||
164
- (pattern [j ] === - 1 && nums [i + j + 1 ] >= nums [i + j ])
165
- ) {
166
- flag = false ;
167
- break ;
151
+ const f = (a : number , b : number ) => (a === b ? 0 : a < b ? 1 : - 1 );
152
+ const n = nums .length ;
153
+ const m = pattern .length ;
154
+ let ans = 0 ;
155
+ for (let i = 0 ; i < n - m ; ++ i ) {
156
+ let ok = 1 ;
157
+ for (let k = 0 ; k < m && ok ; ++ k ) {
158
+ if (f (nums [i + k ], nums [i + k + 1 ]) !== pattern [k ]) {
159
+ ok = 0 ;
168
160
}
169
161
}
170
- if (flag ) {
171
- count ++ ;
162
+ ans += ok ;
163
+ }
164
+ return ans ;
165
+ }
166
+ ```
167
+
168
+ ``` cs
169
+ public class Solution {
170
+ public int CountMatchingSubarrays (int [] nums , int [] pattern ) {
171
+ int n = nums .Length , m = pattern .Length ;
172
+ int ans = 0 ;
173
+ for (int i = 0 ; i < n - m ; ++ i ) {
174
+ int ok = 1 ;
175
+ for (int k = 0 ; k < m && ok == 1 ; ++ k ) {
176
+ if (f (nums [i + k ], nums [i + k + 1 ]) != pattern [k ]) {
177
+ ok = 0 ;
178
+ }
179
+ }
180
+ ans += ok ;
172
181
}
182
+ return ans ;
183
+ }
184
+
185
+ private int f (int a , int b ) {
186
+ return a == b ? 0 : (a < b ? 1 : - 1 );
173
187
}
174
- return count ;
175
188
}
176
189
```
177
190
0 commit comments