@@ -67,42 +67,50 @@ tags:
67
67
68
68
<!-- solution:start -->
69
69
70
- ### 方法一
70
+ ### 方法一:计数
71
+
72
+ 我们注意到,元素的范围是 $[ 1, 100] $,我们可以用一个长度为 $101$ 的数组 $\textit{cnt}$ 来记录每个元素出现的次数。
73
+
74
+ 由于数组 $\textit{arrays}$ 中的每个数组都是严格递增排序的,因此,公共子序列的元素必然是单调递增,并且这些元素的出现次数都等于 $\textit{arrays}$ 的长度。
75
+
76
+ 因此,我们可以遍历 $\textit{arrays}$ 中的每个数组,统计每个元素的出现次数,最后,从小到大遍历 $\textit{cnt}$ 的每个元素,如果出现次数等于 $\textit{arrays}$ 的长度,那么这个元素就是公共子序列的元素之一,我们将其加入答案数组中。
77
+
78
+ 遍历结束后,返回答案数组即可。
79
+
80
+ 时间复杂度 $O(M + N)$,空间复杂度 $O(M)$。其中 $M$ 为元素的范围,本题中 $M = 101$,而 $N$ 为数组所有元素的个数。
71
81
72
82
<!-- tabs:start -->
73
83
74
84
#### Python3
75
85
76
86
``` python
77
87
class Solution :
78
- def longestCommomSubsequence (self , arrays : List[List[int ]]) -> List[int ]:
79
- n = len (arrays)
80
- counter = defaultdict(int )
81
- for array in arrays:
82
- for e in array:
83
- counter[e] += 1
84
- return [e for e, count in counter.items() if count == n]
88
+ def longestCommonSubsequence (self , arrays : List[List[int ]]) -> List[int ]:
89
+ cnt = [0 ] * 101
90
+ for row in arrays:
91
+ for x in row:
92
+ cnt[x] += 1
93
+ return [x for x, v in enumerate (cnt) if v == len (arrays)]
85
94
```
86
95
87
96
#### Java
88
97
89
98
``` java
90
99
class Solution {
91
- public List<Integer > longestCommomSubsequence (int [][] arrays ) {
92
- Map< Integer , Integer > counter = new HashMap<> () ;
93
- for (int [] array : arrays) {
94
- for (int e : array ) {
95
- counter . put(e, counter . getOrDefault(e, 0 ) + 1 ) ;
100
+ public List<Integer > longestCommonSubsequence (int [][] arrays ) {
101
+ int [] cnt = new int [ 101 ] ;
102
+ for (var row : arrays) {
103
+ for (int x : row ) {
104
+ ++ cnt[x] ;
96
105
}
97
106
}
98
- int n = arrays. length;
99
- List<Integer > res = new ArrayList<> ();
100
- for (Map . Entry<Integer , Integer > entry : counter. entrySet()) {
101
- if (entry. getValue() == n) {
102
- res. add(entry. getKey());
107
+ List<Integer > ans = new ArrayList<> ();
108
+ for (int i = 0 ; i < 101 ; ++ i) {
109
+ if (cnt[i] == arrays. length) {
110
+ ans. add(i);
103
111
}
104
112
}
105
- return res ;
113
+ return ans ;
106
114
}
107
115
}
108
116
```
@@ -112,39 +120,60 @@ class Solution {
112
120
``` cpp
113
121
class Solution {
114
122
public:
115
- vector<int > longestCommomSubsequence(vector<vector<int >>& arrays) {
116
- unordered_map<int, int> counter;
117
- vector<int > res;
118
- int n = arrays.size();
119
- for (auto array : arrays) {
120
- for (auto e : array) {
121
- counter[ e] += 1;
122
- if (counter[ e] == n) {
123
- res.push_back(e);
124
- }
123
+ vector<int > longestCommonSubsequence(vector<vector<int >>& arrays) {
124
+ int cnt[ 101] {};
125
+ for (const auto& row : arrays) {
126
+ for (int x : row) {
127
+ ++cnt[ x] ;
125
128
}
126
129
}
127
- return res;
130
+ vector<int > ans;
131
+ for (int i = 0; i < 101; ++i) {
132
+ if (cnt[ i] == arrays.size()) {
133
+ ans.push_back(i);
134
+ }
135
+ }
136
+ return ans;
128
137
}
129
138
};
130
139
```
131
140
132
141
#### Go
133
142
134
143
```go
135
- func longestCommomSubsequence (arrays [][]int) []int {
136
- counter := make(map[int ]int)
137
- n := len( arrays)
138
- var res []int
139
- for _, array := range arrays {
140
- for _, e := range array {
141
- counter[e]++
142
- if counter[e] == n {
143
- res = append(res, e)
144
- }
144
+ func longestCommonSubsequence (arrays [][]int) (ans []int) {
145
+ cnt := [101 ]int{}
146
+ for _, row := range arrays {
147
+ for _, x := range row {
148
+ cnt[x]++
149
+ }
150
+ }
151
+ for x, v := range cnt {
152
+ if v == len(arrays) {
153
+ ans = append(ans, x)
145
154
}
146
155
}
147
- return res
156
+ return
157
+ }
158
+ ```
159
+
160
+ #### TypeScript
161
+
162
+ ``` ts
163
+ function longestCommonSubsequence(arrays : number [][]): number [] {
164
+ const cnt: number [] = Array (101 ).fill (0 );
165
+ for (const row of arrays ) {
166
+ for (const x of row ) {
167
+ ++ cnt [x ];
168
+ }
169
+ }
170
+ const ans: number [] = [];
171
+ for (let i = 0 ; i < 101 ; ++ i ) {
172
+ if (cnt [i ] === arrays .length ) {
173
+ ans .push (i );
174
+ }
175
+ }
176
+ return ans ;
148
177
}
149
178
```
150
179
@@ -156,56 +185,24 @@ func longestCommomSubsequence(arrays [][]int) []int {
156
185
* @return {number[]}
157
186
*/
158
187
var longestCommonSubsequence = function (arrays ) {
159
- const m = new Map ();
160
- const rs = [];
161
- const len = arrays .length ;
162
- for (let i = 0 ; i < len; i++ ) {
163
- for (let j = 0 ; j < arrays[i].length ; j++ ) {
164
- m .set (arrays[i][j], (m .get (arrays[i][j]) || 0 ) + 1 );
165
- if (m .get (arrays[i][j]) === len) rs .push (arrays[i][j]);
188
+ const cnt = Array (101 ).fill (0 );
189
+ for (const row of arrays) {
190
+ for (const x of row) {
191
+ ++ cnt[x];
166
192
}
167
193
}
168
- return rs;
194
+ const ans = [];
195
+ for (let i = 0 ; i < 101 ; ++ i) {
196
+ if (cnt[i] === arrays .length ) {
197
+ ans .push (i);
198
+ }
199
+ }
200
+ return ans;
169
201
};
170
202
```
171
203
172
204
<!-- tabs: end -->
173
205
174
206
<!-- solution: end -->
175
207
176
- <!-- solution: start -->
177
-
178
- ### 方法二
179
-
180
- <!-- tabs: start -->
181
-
182
- #### Python3
183
-
184
- ``` python
185
- class Solution :
186
- def longestCommomSubsequence (self , arrays : List[List[int ]]) -> List[int ]:
187
- def common (l1 , l2 ):
188
- i, j, n1, n2 = 0 , 0 , len (l1), len (l2)
189
- res = []
190
- while i < n1 and j < n2:
191
- if l1[i] == l2[j]:
192
- res.append(l1[i])
193
- i += 1
194
- j += 1
195
- elif l1[i] > l2[j]:
196
- j += 1
197
- else :
198
- i += 1
199
- return res
200
-
201
- n = len (arrays)
202
- for i in range (1 , n):
203
- arrays[i] = common(arrays[i - 1 ], arrays[i])
204
- return arrays[n - 1 ]
205
- ```
206
-
207
- <!-- tabs: end -->
208
-
209
- <!-- solution: end -->
210
-
211
208
<!-- problem: end -->
0 commit comments